将大型 xml 字符串保存/读取到/从文件中

Posted

技术标签:

【中文标题】将大型 xml 字符串保存/读取到/从文件中【英文标题】:Saving/reading large xml string to/from file 【发布时间】:2013-03-27 16:02:04 【问题描述】:

所以,我的应用程序从肥皂服务器接收到一个大的 xml。我希望将其保存在一个文件中,以备后用。我设法做到了这一点,并阅读了文件。但是结果(阅读后)是乱码的xml! xml 后半部分的大部分文本(412 个字符)被复制并粘贴到我的 xml 末尾,我不知道为什么会这样。 我尝试了 2 种写入文件的方法和 2 种读取文件的方法,没有骰子! (下面会贴出代码)注意:xml很大5000-20000个字符,所以我用了一些方法来防止eclipse返回内存不足的错误。

底线:

-输入的xml文件正确

-输出xml文件不正确

-尝试了2种保存方法

-尝试了两种读取方法

-wtf?!

保存代码1:

                    InputStream is = new ByteArrayInputStream(string.getBytes());

                    FileOutputStream fos = ctx.openFileOutput(filename, Context.MODE_PRIVATE);

                        byte[] buffer = new byte[1024];
                        int length;
                        while ((length = is.read(buffer))>0)
                            fos.write(buffer, 0, length);
                        

                        fos.flush();
                        fos.close();
                        is.close();

保存代码2:

                InputStream is = new ByteArrayInputStream(string.getBytes());

                    BufferedReader reader = new BufferedReader(new InputStreamReader(
                            is, "iso-8859-1"), 8);
                    FileOutputStream fos = ctx.openFileOutput(filename, Context.MODE_PRIVATE);
                    StringBuilder sb = new StringBuilder();
                    String line = null;

                    while ((line = reader.readLine()) != null) 
                        Log.e("stuff is good", "line: "+line);
                        sb.append(line);

                        if (sb.toString().length() > 10000) 
                           fos.write(sb.toString().getBytes());
                           fos.flush();
                           sb = new StringBuilder();

                        

                    

                    fos.write(sb.toString().getBytes());
                    fos.flush();
                    is.close();
                    fos.close();

读取代码 1:

            FileInputStream fis = openFileInput("caca");
                    int c;
                    StringBuilder fileContent = new StringBuilder();

                    while((c=fis.read())!=-1)
                            
                        fileContent.append((char)c);

                            
                    fis.close();

                    Log.e("TEST TEST", "XML length = "
                            +String.valueOf(fileContent.length()) );
                    Log.e("TEST TEST", "XML = "
                            +fileContent );

阅读代码 2:

        FileInputStream fis;
                    fis = openFileInput("caca");
                    StringBuffer fileContent = new StringBuffer("");
                    byte[] buffer = new byte[1024];
                    int i =1;
                    while (fis.read(buffer) != -1) 
                        fileContent.append(new String(buffer));
                        Log.v("TEST"+ String.valueOf(i), new String(buffer) );
                        i++;
                    
                    Log.e("TEST TEST", "XML length = "
                            +String.valueOf(fileContent.length()) );
                    Log.e("TEST TEST", "XML = "
                            +fileContent );

保存到文件代码:

                        File myFile = new File("/sdcard/mysdfile.txt");
                        myFile.createNewFile();
                        FileOutputStream fOut = new FileOutputStream(myFile);
                        OutputStreamWriter myOutWriter = 
                                                new OutputStreamWriter(fOut);
                        myOutWriter.append(fileContent);
                        myOutWriter.close();
                        fOut.close();
                        Toast.makeText(getBaseContext(),
                                "Done writing SD 'mysdfile.txt'",
                                Toast.LENGTH_SHORT).show();

抱歉,这篇文章太长了,但 3 天后,我已经束手无策了。任何输入都会很好,谢谢!

【问题讨论】:

对不起,323go,那个人离开了我。在发布代码之前,我删除了其他 6 或 7 个不合适的 Log.e。 【参考方案1】:

我更喜欢为此使用Apache Commons IO:

DefaultHttpClient client = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(url + id);

try 
    HttpResponse response = client.execute(httpGet);
    InputStream content = response.getEntity().getContent();        
    StringWriter writer = new StringWriter();
    IOUtils.copy(content, writer, "utf-8");
    return writer.toString(); 

 catch (ClientProtocolException e) 
    Log.e(tag, "client problem:" + e.getMessage());
    throw new RuntimeException("client problem",e);
 catch (IOException e) 
    Log.e(tag, "IO problem:" + e.getMessage());
    throw new RuntimeException("IO problem",e);

然后像往常一样写出字符串。

【讨论】:

好吧,我很困惑。这应该如何帮助我?我已经有了要写入的字符串,当我将字符串写入文件然后再次读取时,就会出现问题。【参考方案2】:

好的....我修复了它,我不知道它为什么会起作用。

保存代码:

    public static void Save(String filename, String string, 
          Context ctx) 
            Log.e("stuff is good", "xml length b4 save= "+String.valueOf(string.length()));

                try 
                    FileOutputStream fOut = ctx.openFileOutput(filename, Context.MODE_PRIVATE); 

                    OutputStreamWriter myOutWriter = 
                                            new OutputStreamWriter(fOut);
                    myOutWriter.append(Login.messagesXmlDump);
                    myOutWriter.close();
                    fOut.close();
                 catch (FileNotFoundException e) 
                    e.printStackTrace();
                 catch (IOException e) 
                    e.printStackTrace();
                

            

阅读代码:

                    Save("LOL", messagesXmlDump, getApplicationContext());

                try 

                    FileInputStream fis = openFileInput("LOL");
                    int c;
                    StringBuilder fileContent = new StringBuilder();

                    while((c=fis.read())!=-1)
                            
                        fileContent.append((char)c);

                            
                    fis.close();

设法写入/读取 70k 个字符长的 xml。也许保存它的递归方法不是最好的主意。认为我把一件简单的事情复杂化了。

很抱歉浪费您的时间:(

【讨论】:

以上是关于将大型 xml 字符串保存/读取到/从文件中的主要内容,如果未能解决你的问题,请参考以下文章

将大型 json 字符串从 Javascript 发布到 Django

如何将静态字符串保存到 XML 文件?

c语言读取文件然后保存到数组中

Python 从文件中读取并保存到 utf-8

在 PHP 中不使用太多内存的情况下读取/写入大型 XML

读取在java中存储为字符串的xml [重复]