Java 如何在每次不关闭输出流对象的情况下向文件添加字符串

Java 如何在每次不关闭输出流对象的情况下向文件添加字符串,java,android,Java,Android,我将接收一大块数据(比如1000个数据/秒,每个数据的最小大小为15个字节)。我以前的方法是每次创建一个新的outputstream对象,指定路径并将值添加到文件中,所有这些都是在单独的线程中完成的。然而,我仍然面临着一个性能的打击。我教书,而不是像以前那样将数据写入文件 File dir = new File(android.os.Environment.getExternalStorageDirectory().getAbsolutePath() + DEBUG_FILE_PATH); b

我将接收一大块数据(比如1000个数据/秒,每个数据的最小大小为15个字节)。我以前的方法是每次创建一个新的outputstream对象,指定路径并将值添加到文件中,所有这些都是在单独的线程中完成的。然而,我仍然面临着一个性能的打击。我教书,而不是像以前那样将数据写入文件

File dir = new 
File(android.os.Environment.getExternalStorageDirectory().getAbsolutePath() + DEBUG_FILE_PATH);
boolean b = dir.mkdirs();
try
{
    fileOutputStream = new FileOutputStream(new File(dir, FILE_NAME), 
    true);
    outputStreamWriter = new OutputStreamWriter(fileOutputStream);
}
catch (FileNotFoundException e)
{
    e.printStackTrace();
}

outputstreamwriter.append("some data").close(); 
我希望维护outputstreamwriter和其他对象,并使用它们将数据添加到outputstreamwriter缓冲区,以及在我的应用程序结束时(当我关闭应用程序时,可能在onDestroy()活动方法中)。我需要将数据写入文件,然后关闭所有打开的流

这种方法适合我,但outputstreamwriter的缓冲区大小仅为8kb。这比我收到的数据量要少


我该如何解决这个问题?

您的大部分性能损失很可能是在每次需要向文件写入几个字节时打开该文件

因此,如果您只是一直取消文件的打开和关闭,您应该可以

只需打开文件一次,在数据到达时继续向其写入数据,然后在应用程序关闭时关闭文件

这样,使用缓冲OutputStreamWriter将为您带来性能优势,而不必担心其缓冲区的大小:当其缓冲区已满时,它将对您透明地刷新自身。你不需要知道它的工作原理和缓冲区的大小。

这解决了我的问题。 通过这种方法,我在应用程序启动时打开了一次文件,并将从服务接收到的“n”值添加到文件中。我正在刷新缓冲区(这会将数据写入文件)。现在,即使我收到不超过8kb(缓冲区最大大小)的大数据,我也可以将其写入已打开的文件中。最后,当应用程序关闭时,我将关闭流

//Util class
public static File dir;
public static FileOutputStream fileOutputStream;
public static OutputStreamWriter outputStreamWriter;

//Different class, you can initialize it on your Application class or home activity
private void initializeFileWriteObjects()
{
    dir = new File(android.os.Environment.getExternalStorageDirectory().getAbsolutePath() + DEBUG_FILE_PATH);
    boolean b = dir.mkdirs();
    try
    {
        fileOutputStream = new FileOutputStream(new File(dir, FILE_NAME), true);
    }
    catch (FileNotFoundException e)
    {
        e.printStackTrace();
    }
    outputStreamWriter = new OutputStreamWriter(fileOutputStream);
}

//Util File
private static boolean writeToFile(final byte[] stream)
{
    //Convert String to hex, as I want this to be in hex
    final String stringData = byteArrayToHexString(stream);

    try
    {
        outputStreamWriter.append(stringData);
        outputStreamWriter.flush();
    }
    catch (IOException e)
    {
        e.printStackTrace();
        return false;
    }
    return true;
}

//When the app is closed.
@Override
protected void onDestroy()
{
    super.onDestroy();
    closeFileStream();
}

//This method is in same Util class, but called at onDestroy()
public static void closeFileStream()
{
    try
    {
        outputStreamWriter.close();
        fileOutputStream.close();
    }
    catch (IOException e)
    {
        e.printStackTrace();
    }
}

刷新而不是关闭?正如Artemis所说,您只需要刷新,但这可能是确保流关闭的一个好主意,您需要进行大量测试(例如,如果应用程序崩溃、删除等),谢谢您的评论。我没有专注于冲洗法。这解决了我的问题。