首页 \ 问答 \ 在android中附加文件的问题(Issue on appending a file in android)

在android中附加文件的问题(Issue on appending a file in android)

我正在创建一个android应用程序,它读取和写入位置/sdcard/ReadandWrite/中的文件。当我写入该文件时,它不会写入附加模式。它将删除旧数据并写入新数据。请帮我解决这个问题。这是我的代码。

private File openfile() {
    File sdCard = Environment.getExternalStorageDirectory();
    File dir = new File (sdCard.getAbsolutePath() + "/ReadandWrite");
    dir.mkdirs();
    File file = new File(dir, "myfile.txt");
    file.setWritable(true);
    if(file.exists())
    {
        file.canRead();
        file.setWritable(true);

    }
    else {
        try {
            file.createNewFile();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    return file;
}

private void writetofile() {


    try {
        File file=openfile();
        OutputStreamWriter myOutWriter =
                new OutputStreamWriter(new FileOutputStream(file));
        myOutWriter.append(text.getText());

        myOutWriter.close();
        myOutWriter.close();
        Toast.makeText(getBaseContext(),
                "Done writing SD 'mysdfile.txt'",
                Toast.LENGTH_SHORT).show();
    } catch (Exception e) {
        Toast.makeText(getBaseContext(), e.getMessage(),
                Toast.LENGTH_SHORT).show();
    }

I am creating an android application which reads and writes data to a file in the location /sdcard/ReadandWrite/.when i writing to that file it does not write in append mode.it will removes the old data and writes the new one.please help me to solve this.Here is my code.

private File openfile() {
    File sdCard = Environment.getExternalStorageDirectory();
    File dir = new File (sdCard.getAbsolutePath() + "/ReadandWrite");
    dir.mkdirs();
    File file = new File(dir, "myfile.txt");
    file.setWritable(true);
    if(file.exists())
    {
        file.canRead();
        file.setWritable(true);

    }
    else {
        try {
            file.createNewFile();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    return file;
}

private void writetofile() {


    try {
        File file=openfile();
        OutputStreamWriter myOutWriter =
                new OutputStreamWriter(new FileOutputStream(file));
        myOutWriter.append(text.getText());

        myOutWriter.close();
        myOutWriter.close();
        Toast.makeText(getBaseContext(),
                "Done writing SD 'mysdfile.txt'",
                Toast.LENGTH_SHORT).show();
    } catch (Exception e) {
        Toast.makeText(getBaseContext(), e.getMessage(),
                Toast.LENGTH_SHORT).show();
    }

原文:https://stackoverflow.com/questions/28166932
更新时间:2020-10-24 22:10

最满意答案

您需要配置FileOutputStream以使用append模式。 从JDK文档

public FileOutputStream(String name,boolean append)抛出FileNotFoundException

创建文件输出流以写入具有指定名称的文件。 如果第二个参数为true,则字节将写入文件的末尾而不是开头。 创建一个新的FileDescriptor对象来表示此文件连接。

首先,如果有安全管理器,则调用其checkWrite方法,并将name作为其参数。

如果文件存在但是是目录而不是常规文件,则不存在但无法创建,或者由于任何其他原因而无法打开,则会引发FileNotFoundException。

参数:name - 依赖于系统的文件名append - 如果为true,则将字节写入文件末尾而不是开头抛出:FileNotFoundException - 如果文件存在但是是目录而不是常规文件,则不存在但无法创建,或因任何其他原因无法打开。 SecurityException - 如果存在安全管理器且其checkWrite方法拒绝对该文件的写访问。 从:JDK1.1参见:SecurityManager.checkWrite(java.lang.String)

所以更改OutputStreamWriter myOutWriter = new OutputStreamWriter(new FileOutputStream(file));

OutputStreamWriter myOutWriter = new OutputStreamWriter(new FileOutputStream(file, true));


You need to configure the FileOutputStream to use append mode. From JDK documentation:

public FileOutputStream(String name, boolean append) throws FileNotFoundException

Creates a file output stream to write to the file with the specified name. If the second argument is true, then bytes will be written to the end of the file rather than the beginning. A new FileDescriptor object is created to represent this file connection.

First, if there is a security manager, its checkWrite method is called with name as its argument.

If the file exists but is a directory rather than a regular file, does not exist but cannot be created, or cannot be opened for any other reason then a FileNotFoundException is thrown.

Parameters: name - the system-dependent file name append - if true, then bytes will be written to the end of the file rather than the beginning Throws: FileNotFoundException - if the file exists but is a directory rather than a regular file, does not exist but cannot be created, or cannot be opened for any other reason. SecurityException - if a security manager exists and its checkWrite method denies write access to the file. Since: JDK1.1 See Also: SecurityManager.checkWrite(java.lang.String)

So change OutputStreamWriter myOutWriter = new OutputStreamWriter(new FileOutputStream(file));

to

OutputStreamWriter myOutWriter = new OutputStreamWriter(new FileOutputStream(file, true));

2015-01-27

相关问答

更多

OutputStreamWriter.append不将文本附加到Android编程的文本文件中(OutputStreamWriter.append not appending text to a text file Android Programming)

使用带有append标志的构造函数 FileOutputStream fos = new FileOutputStream(file, true); Use the constructor with the append flag FileOutputStream fos = new FileOutputStream(file, true);

将新对象附加到现有文件(Appending New Object to the existing file)

遗憾的是,每次要添加到流中时都无法创建新的ObjectOutputStream ,然后使用单个流读取所有内容。 在开始编写对象之前, 构造函数会将标头添加到基础流。 您可能正在看到java.io.StreamCorruptedException: invalid type code: AC异常,这是因为第一个标头是0xAC 。 我不知道你要处理多少个对象,但是一个选项可能是读取所有对象,然后使用单个ObjectOutputStream重写它们。 如果有很多对象,这可能会变得昂贵。 或者,您可能需要 ...

Android没有创建/附加a.txt文件(Android not creating/appending a.txt file)

您无法将文件写入assets文件夹.eperties文件夹在运行时是只读的。 选择其他位置以保存数据。 即,Environment.getExternalStorageDirectory()不使用Environment.getExternalStorageDirectory()。getAbsolutePath()。 要从资产中读取文件,请使用以下方法 public String readFromAsset(String fileName, Context context) { StringBuil ...

附加到android中的文件(Appending to a file in android)

使用FilterWriter对象。 它为构造函数提供了将写入附加到当前文件的选项,甚至可以根据需要创建文件。 Use a FilterWriter object. It provides a constructor with the option to append writes to the current file, and even takes care of creating the file if needed.

在android中的/ system / location中附加文件(Appending a file in /system/ location in android)

您可以使用Context.getFilesDir()方法获取内部存储的路径 编辑 使用此行时FileOutputStream fileOuputStream = openFileOutput(name, MODE_PRIVATE); 内部存储路径是通过openFileOutput()方法的默认实现获得的。 将在具有指定名称的该位置创建新文件。 现在,当您想获取同一文件的路径时,可以使用getFilesDir()来获取创建文件的目录的绝对路径 。 你可以这样做: - File file = new ...

附加文件,而不是覆盖它?(Appending a file, instead of overwriting it?)

FileWriter fw = new FileWriter(file.getAbsoluteFile() ,true); 通过传递append true以追加模式打开。 public FileWriter(File file, boolean append) throws IOException 给定File对象的构造FileWriter对象。 如果第二个参数为true,则字节将写入文件的末尾而不是开头。 FileWriter fw = new FileWriter(file.g ...

使用Google Drive Android API将数据附加到文件(Appending data to file using Google Drive Android API)

你可以尝试在提交内容之前刷新你的OutputStream,即writer.flush()吗? 此外,考虑使用FileOutputStream#getChannel而不是读取InputStream中的所有现有字节,因为FileChannel具有快速搜索到文件末尾的功能,即fileChannel.position(fileChannel.size()) Can you try flushing your OutputStream, i.e. writer.flush(), before committ ...

在android中附加文件的问题(Issue on appending a file in android)

您需要配置FileOutputStream以使用append模式。 从JDK文档 : public FileOutputStream(String name,boolean append)抛出FileNotFoundException 创建文件输出流以写入具有指定名称的文件。 如果第二个参数为true,则字节将写入文件的末尾而不是开头。 创建一个新的FileDescriptor对象来表示此文件连接。 首先,如果有安全管理器,则调用其checkWrite方法,并将name作为其参数。 如果文件存在但 ...

相关文章

更多

最新问答

更多
  • 如何保护Solr只允许SELECT请求给用户并禁止其他任何东西?(How to secure Solr to allow SELECT request to only users and disallow anything else?)
  • XPath表达式无效/错误TFHpple SWIFT 1.2(XPath Expression not working/incorrect TFHpple SWIFT 1.2)
  • css3 3D变换不能平滑地制作动画(css3 3D transform doesn't animate smoothly)
  • 运行时错误'91'和Outlook.Application = <对象变量或没有设置块变量>?(Run-time error '91' & Outlook.Application = Object variable or With block variable not set?)
  • 慢的webservice问题(Slow webservice problem)
  • textview的不正确对齐方式(Improper alignment of a textview)
  • 在第一步“Hello World”中出现Java错误(Cannot run “Hello World” program in Eclipse)
  • 为什么十六进制地址是14个字符?(why the hex address is 14 character?)
  • 如何在Python中的不同类中使用变量?(How to use variable in different classes in Python?)
  • asp:GridView HYPERLINKFIELD - datanavigateurlformatstring中的asp代码(asp:GridView HYPERLINKFIELD - asp code inside datanavigateurlformatstring)
  • 关于adaboost算法(About adaboost algorithm)
  • 在Matlab上内置图像(Built in Images on Matlab)
  • java swing:输入键事件时焦点丢失(java swing: Focus lost on enter key event)
  • C#中的通用约束,T是相同的TSomethingElse,对吧?(Generic constraints in C#, T is the same TSomethingElse, right?)
  • 从mybatis中的光标获取数据(Fetching data from cursor in mybatis)
  • 在运行时从XML构建对象的最佳方法(Best way for building objects out of XMLs at runtime)
  • 在整个窗口中拉伸sf :: Sprite(Stretch sf::Sprite across entire window)
  • Selenium Node API Web驱动程序等待超时处理程序(Selenium Node API web driver wait timeout handler)
  • 函数使用并且是map的一部分(循环依赖?)(Function uses and is part of map (circular dependency?))
  • 是否可以在C ++ 14中使用可选模板参数创建类型元组?(Is possible to make a tuple of types with optional template parameters in C++14?)
  • PHP从窗帘后面打印/ f(PHP prints /f from behind the curtains)
  • JFrame的contentPane的LayoutManager(LayoutManager of JFrame's contentPane)
  • 用于Instagram Feed的图像滚动(Image Roll Overs for Instagram Feed)
  • 如何显示拉伸字体(双倍宽度/高度)?(How to display stretched font (double width/height)?)
  • 文件操作API在fileapi.h和stdio.h中的WP8差异?(WP8 differences between file manipulation APIs in fileapi.h and stdio.h?)
  • 保存失败后Rails没有回滚事务()(Rails not rolling back transaction after failed save())
  • jqgrid中的分页问题与数组数据(Pagination problem in jqgrid with array data)
  • 重定向时,通过其他页面上的URL调用javascript函数(Call javascript function through url on otherpage while Redirecting)
  • 如何使用InvokeCommandAction调用我的方法并传入参数?(How do I go about using InvokeCommandAction to call a method of mine and pass in parameters?)
  • Jquerymobile按钮仅显示页面的第一个外观(Jquerymobile buttons are shown only first apperance of the page)