GVKun编程网logo

FileInputStream和FileOutputStream到同一文件:是否保证read()可以查看“之前”发生的所有write()?

7

本文的目的是介绍FileInputStream和FileOutputStream到同一文件:是否保证read的详细情况,特别关注可以查看“之前”发生的所有write的相关信息。我们将通过专业的研究、有

本文的目的是介绍FileInputStream和FileOutputStream到同一文件:是否保证read的详细情况,特别关注可以查看“之前”发生的所有write的相关信息。我们将通过专业的研究、有关数据的分析等多种方式,为您呈现一个全面的了解FileInputStream和FileOutputStream到同一文件:是否保证read的机会,同时也不会遗漏关于37、使用FileInputStream和FileOutputStream读取和写入、Android FileInputStream read()txt文件转换为String、bufferedinputstream FileInputStream inputstream的比较、FileInputStream与FileOutputstream的知识。

本文目录一览:

FileInputStream和FileOutputStream到同一文件:是否保证read()可以查看“之前”发生的所有write()?

FileInputStream和FileOutputStream到同一文件:是否保证read()可以查看“之前”发生的所有write()?

我正在使用文件作为大数据的缓存。一个线程顺序地对其进行写入,另一个线程顺序地对其进行读取。

我可以确定在Java内存模型方面假设正确的“先发生”关系后,已经确定write()在一个线程中(由)写入的所有数据都可以read()来自另一个线程吗?是否记录了这种行为?

在我的JDK中,FileOutputStream不覆盖flush(),并且OutputStream.flush()为空。这就是为什么我想知道…

有问题的流完全由我完全控制的类所拥有。保证每个流只能由一个线程访问。我的测试表明它可以按预期工作,但是我仍然想知道是否可以保证并记录下来。

另请参阅此相关讨论。

答案1

小编典典

假设您正在使用posix文件系统,则可以。

FileInputStream``FileOutputStream在*
nix上,在内部使用读写系统调用。写文档说明读将看到过去写的结果,

对常规文件执行write()成功返回后:

从该写操作修改的文件中每个字节位置开始的任何成功read()都应返回该位置的write()指定的数据,直到再次修改该字节位置为止。

我很确定Windows上的ntfs将具有相同的read() write()保证。

37、使用FileInputStream和FileOutputStream读取和写入

37、使用FileInputStream和FileOutputStream读取和写入

绝对路径和相对路径

  • 绝对路径:指文件在硬盘上真正存在的路径,比如:D:\Java\HelloWorld.java,这个指的是在电脑的d盘下的Java文件夹里面有个HelloWorld.java文件
  • 相对路径:指某个文件的路径和别的文件的路径关系,比如在d盘里面有个两个文件,路径分别是:D:\Java\HelloWorld.java和D:\Java\images\monkey.png。他们都在d盘中的Java文件夹里面,其中monkey.png这个文件的路径相对HelloWorld.java来说就是\images\monkey.png

使用FileInputStream读取文件中的内容

在项目的根目录里面创建一个file文件夹,在这个文件夹里面再创建monkey.txt的文本文件,然后在里面写上abc这三个字母,保存关闭。
下面通过FileInputStream将硬盘中的monkey.txt文件中的内容读取到内存当中并在控制台打印,操作结束之后注意关闭流释放资源,这里相当于在内存和硬盘之间放一个梯子,在将硬盘中的文件全部读取到内存之后,需要拿掉梯子,否则会浪费资源。

package com.sutaoyu.IO;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class IO_test_2 {
    public static void main(String[] args) {
        FileInputStream fis = null;
        try {
            //绝对路径,需要加转义字符
            //fis = new FileInputStream("F:\\monkey1024\\01-JavaSE\\代码\\code\\chapter-08\\file\\monkey.txt");
            //相对路径
            fis = new FileInputStream("file\\monkey.txt");
            //定义byte数组每次读取三个字节提高效率
            byte[] bytes = new byte[3];
            
            int temp;
            //如果返回-1则说明读取完毕
            while((temp = fis.read(bytes)) != -1) {
                System.out.println(new String(bytes,0,temp));
            }
        }catch(FileNotFoundException e) {
            e.printStackTrace();
        }catch(IOException e) {
            e.printStackTrace();
        }finally {
            try {
                fis.close();
            }catch(IOException e) {
                e.printStackTrace();
            }
        }
    }
}

使用FileOutputStream向文件写出内容

向1024.txt文件中写出字母

在windos中的文件路径是以”\”来分隔
在linux中的文件路径是以”/”来分隔
如果将上面代码部署到linux中会读取不到文件,为了保证编写的代码跨平台需要使用java.io包下的File.separator来替代文件路径的分隔符,如下:

fis = new FileInputStream("file\\monkey.txt");

修改为

fis = new FileInputStream("file" + File.separator + "monkey.txt");

 

Android FileInputStream read()txt文件转换为String

Android FileInputStream read()txt文件转换为String

有专家可以帮助我吗?在我的Android主要活动中,我试图将字符串保存到文件中,然后如果用户之前对其进行设置,则将其检索。无法找到与我正在做的事情相近的例子。我将不胜感激任何帮助!这是我崩溃的测试用例:

String testString = "WORKS";String readString;@Overridepublic void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.main);    FileOutputStream fos;    try {        fos = openFileOutput("test.txt", Context.MODE_PRIVATE);        fos.write(testString.getBytes());        fos.close();    } catch (FileNotFoundException e) {        e.printStackTrace();    } catch (IOException e) {        e.printStackTrace();    }    File file = getBaseContext().getFileStreamPath("test.txt");    if (file.exists()) {        FileInputStream fis;        try {            fis = openFileInput("test.txt");            fis.read(readString.getBytes());            fis.close();        } catch (IOException e) {            e.printStackTrace();        }        txtDate.setText(String.valueOf(readString));       } else {                     // more code       }     } }

答案1

小编典典

要读取文件,请尝试以下操作:

FileInputStream fis;fis = openFileInput("test.txt");StringBuffer fileContent = new StringBuffer("");byte[] buffer = new byte[1024];while ((n = fis.read(buffer)) != -1) {   fileContent.append(new String(buffer, 0, n)); }

bufferedinputstream FileInputStream inputstream的比较

bufferedinputstream FileInputStream inputstream的比较

BufferedInputStream类相比InputStream类,提高了输入效率,增加了输入缓冲区的功能

 

不带缓冲的操作,每读一个字节就要写入一个字节,由于涉及磁盘的IO操作相比内存的操作要慢很多,所以不带缓冲的流效率很低

带缓冲的流,可以一次读很多字节,但不向磁盘中写入,只是先放到内存里。等凑够了缓冲区大小的时候一次性写入磁盘,这种方式可以减少磁盘操作次数,速度就会提高很多

 

InputStream流是指将字节序列从外设或外存传递到应用程序的流
BufferedInputStream流是指读取数据时,数据首先保存进入缓冲区,其后的操作直接在缓冲区中完成。

 

继承关系是这样的:
Java.lang.Object
     Java.io.InputStrean
          Java.io.FilterInputStream
                Java.io.BufferedInputStream

 

FileInputStream是字节流,BufferedInputStream是字节缓冲流,使用BufferedInputStream读资源比FileInputStream读取资源的效率高(BufferedInputStream的read方法会读取尽可能多的字节),且FileInputStream对象的read方法会出现阻塞;

 

BufferedInputStream比FileInputStream多了一个缓冲区,执行read时先从缓冲区读取,当缓冲区数据读完时再把缓冲区填满。

当每次读取的数据量很小时,FileInputStream每次都是从硬盘读入,而BufferedInputStream大部分是从缓冲区读入。读取内存速度比读取硬盘速度快得多,因此BufferedInputStream效率高。

BufferedInputStream的默认缓冲区大小是8192字节。当每次读取数据量接近或远超这个值时,两者效率就没有明显差别了。

FileInputStream与FileOutputstream

FileInputStream与FileOutputstream

 package cn.file;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
public class FileTest {
 public static void main(String[] args) {
  File file = new File("f://word.text");
  try {
   FileOutputStream out = new FileOutputStream(file);
   byte[] buy = "我有一只小毛驴,我从来也不骑。".getBytes();
   out.write(buy);
   out.close();
  } catch (Exception e) {
   e.printStackTrace();
  }
  try {
   FileInputStream in = new FileInputStream(file);
   byte byt[] = new byte[1024];
   int len = in.read(byt);
   System.out.println("文本中的信息是:" + new String(byt, 0, len));
   in.close();
  } catch (Exception e) {
   e.printStackTrace();
  }
  /*
   * if(file.exists()){ String name=file.getName(); Long
   * length=file.length(); boolean hidden=file.isHidden();
   * System.out.println("文件名:"+name); System.out.println("文件内容长:"+length);
   * System.out.println("文件是否隐藏:"+hidden); /*file.delete();
   * System.out.println("文件已删除");
   * 
   * }else{ try { file.createNewFile(); System.out.println("文件已经创建"); }
   * catch (IOException e) { // TODO Auto-generated catch block
   * e.printStackTrace(); } }
   */
 }/*
   * else{ System.out.println("文件不存在"); } }
   */
}

关于FileInputStream和FileOutputStream到同一文件:是否保证read可以查看“之前”发生的所有write的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于37、使用FileInputStream和FileOutputStream读取和写入、Android FileInputStream read()txt文件转换为String、bufferedinputstream FileInputStream inputstream的比较、FileInputStream与FileOutputstream等相关内容,可以在本站寻找。

本文标签: