‘壹’ 输入流和输出流在java程序的i工巧/o操作中各承担什么功能
咨询记录 · 回答于2021-09-06
‘贰’ Java里那个输入流和输出流怎么用
//java中使用文件输入流和文件输出流进行文件读写的用例!
Java
packagecom.test.io;
importjava.io.File;
importjava.io.FileInputStream;
importjava.io.FileNotFoundException;
importjava.io.FileOutputStream;
importjava.io.IOException;
importjava.io.InputStream;
importjava.io.OutputStream;
/**
*
*@author亚当爱上java
*用例内容:文件输入流和文件输入流结合用例,字节流方式
*时间:2010-06-20
*注意事项:文件输入流和文件输出流都是相对与内存来说的,例如通过程序读取文件时往内存输入数据就是文件输入流
*/
publicclassFileInputOrOutput{
publicstaticvoidmain(String[]args){
//文件或者路径名的抽象表现形式,意思就是说之后如果进行操作的话就是全部在这个抽象路径名所指向的文件或者文件加中
Filefile=newFile("e:/test.txt");
Filefile2=newFile("e:/test1.txt");
//文件字节数的个数
//System.out.println(file.length());
try{
/*------------------------------------------读操作部分-----------------------------------------------*/
//文件输入流对象
InputStreamfis=newFileInputStream(file);
//文件输入流对象所读取的字节数大小
//System.out.println(fis.available());
/**
*1.按照一个字节为单位进行读取数据,弊端是遇到中文就会把中文的汉字拆开从而出现乱码
*/
////流对象读出的返回值是每次所读到的一个字符所对应的ascii码值
//inti=fis.read();
//
////如果已经读到文件尾则i==-1,此时终止循环
//while(i!=-1){
//System.out.print((char)i);
//保证每一次循环都继续往后读取一个字符,否则i的值不变会成为死循环
//i=fis.read();
//}
/**
*2.按照一个字节数组所指定的大小为单位进行读取,每次最多可以读取数组定义的大小的字节个数
*/
//每次读取都以1K字节作为单位来进行
byteb[]=newbyte[1024];
//流对象读出并返回的是每次读取字节的个数,最大每次读取自己数可以和数组b.length相同
//b中存储了每次所读取的所有数据
inti=fis.read(b);
Stringstr="";
//如果已经读到文件尾则i==-1,此时终止循环
while(i!=-1){
//把每次读取的字节数组解码为字符串
//参数1:要解码为字符的字节
//参数2:要解码的首字符的索引
//参数3:要解码的字节的个数,如果文件个数大于所设定的一次读取文件的大小时i的取值就是
//b.length,否则小于数组的字节大小时则为实际的读取出自己数的大小
str=str+newString(b,0,i);
//保证每一次都往文件的下一部分进行读取,否则i值没有变化会成为死循环
i=fis.read(b);
}
//System.out.print(str);
//关闭输入流对象
fis.close();
/*------------------------------------------写操作部分-----------------------------------------------*/
//文件输出流对象
OutputStreamfos=newFileOutputStream(file2);
//str是从file所指定的文件中读出的所有内容,将此内容写入另一个文件中
//将字符解码为字节数组
byteb2[]=str.getBytes();
//将解码后的字节数组,通过文件输出流对象写入到缓冲区中
fos.write(b);
//强制将缓冲区中的内容输出到文件中
fos.flush();
//关闭输出流对象
fos.close();
}catch(FileNotFoundExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}catch(IOExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
}
‘叁’ java 输入输出流 (被采纳为答案者加100分)
其中BufferedInputStream是FileInputStream的子类,你可以理解成同样处理一个文件,BufferedInputStream效率更高,原因是BufferedInputStream采用了更高效的字节流处理方式,
BufferedInputStream才用缓冲流把内在的缓冲器连接到I/O流,允许java程序对多个字节同时操作,这样就提高了效率。
inputstreamreader的构造函数带两个参数,一是关联到的文件,二是字符解码方式. 所以实际上通过inputstreamreader实例读出来的东西已经不是磁盘上原始的字节数据了,而是根据你指定的解码方式(如果你没有指定,则使用系统缺省的,win2000下是gbk/gb2312)把字节流转换成了字符流,注意字节流和字符流的区别,一个字节就是8比特位(32位机器上),而一个字符含多少字节则与不同的编码/解码方式有关了,如gbk是一字节,utf-8是1-3的变长字节,utf-16是2个定长字节.
于是值得你注意的就是当你用inputstreamreader读文件时,你应该知道该文件被存储时是用什么方式编码的,否则你指定错了解码方式,读出来的就是乱码.但是退一步来说,在全英文环境下,问题也没这严重.因为所有的字符集在前七位上都是与ascii兼容的(我猜的,也许有的不是),然而当你的程序涉及中文字符时,肯定是会出错了.
那么fileinputstream的特点呢?它的构造函数就一个,即关联到的文件,既然没有指定解码方式,那它所做的就是只以字节流的方式读出文件而不做任何处理, 你应该用一个字节数组来接受它,对该数组你以后还可以做任何想做的操作。
给你个例子,自己去测试
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.util.*;
public class test {
/* public static void main(String[] args) {
String str=new String("Face recognition in the thermal infrared domain has received relatively little attention in the literature in comparison with recognition in visible-spectrum imagery");
StringTokenizer token=new StringTokenizer(str);
Hashtable ht=new Hashtable();
while(token.hasMoreTokens()){
String temp=new String(token.nextToken());
ht.put(temp,temp);
}
Enumeration en=ht.keys();
while(en.hasMoreElements()){
Object obj=en.nextElement();
System.out.print("KEY_NO:"+obj);
System.out.println("="+ht.get(obj));
}
}
*/
public static void main(String[] args){
try {
String file1 ="d:\\1.doc";
String file2 ="d:\\2.doc";
File(file1,file2);
readFile(file2);
//fileCheck("d:\\test1.txt");
// readFile("D:\\test1.txt");
// readFileByte("D:\\test1.txt");
// readFileByFile("D:\\test1.txt");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void testFile() throws IOException{
File("D:\\test1.txt","D:\\test2.txt");
}
public static void File(String inName,String outName) throws IOException
{
File tmp = new File(outName);
if(!tmp.canRead())tmp.createNewFile();
BufferedInputStream in = new BufferedInputStream(new FileInputStream(inName));
BufferedOutputStream out= new BufferedOutputStream(new FileOutputStream(outName));
File(in,out,true);
}
public static void readFile(String inName) throws IOException
{
BufferedReader read = new BufferedReader (new InputStreamReader(new FileInputStream(inName)));
String b ;
while((b=read.readLine())!=null )
print( b);
}
public static void readFileByte(String inName) throws IOException
{
BufferedInputStream read = new BufferedInputStream (new FileInputStream(inName));
int b = 0;
while((b=read.read())!=-1)
System.out.print ((char)b);
}
public static void readFileByFile(String name) throws IOException
{
File tmp = new File (name);
FileReader fr= new FileReader(tmp);
BufferedReader br = new BufferedReader(fr);
String b;
while((b=br.readLine())!=null)
print(b);
}
public static void File(InputStream in ,OutputStream out, boolean close) throws IOException{
int b;
while((b=in.read())!=-1)
{
out.write(b);
}
in.close();
if(close)
out.close();
}
public static void print(Object o)
{
System.out.println(o);
}
public static void fileCheck(String name) throws IOException
{
print("---"+name+"---");
File f= new File(name);
if(!f.exists())
{
print("fle not exist!");
return;
}
print("Canonical name:"+f.getCanonicalPath());
String p= f.getParent();
if(p!=null)
print("Parent directory :"+p);
if(f.canRead())print("file can be read!");
if(f.canWrite())print("file can be writable!");
Date d = new Date();
d.setTime(f.lastModified());
print("last modified time :"+d);
if(f.isFile())
{
print("file size is :"+f.length()+" bytes");
}else if(f.isDirectory()){print("is a directry!");}
else{
print("neither a directory or a file!");
}
print("");
}
}
‘肆’ Java中如何实现文件的输入和输出
程序如下:
<span style="color:#990000;">
</span>File file1 = new File("/home/a123/a");
if (file1.exists()) {
System.out.println("存在文件夹a");
} else {
file1.mkdir(); // 文件夹的创建 创建文件夹/home/a123/a
}
File file2 = new File("/home/a123/a/test");
if (file2.exists()) {
System.out.println("存在文件夹或者文件test");
} else {
try {
file2.createNewFile(); // 文件的创建,注意与文件夹创建的区别
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 最简单的文件读写方法是使用类FileWriter
* (它的父类依次是java.io.OutputStreamWriter——>java.io.Writer——>java.lang.Object );
*/
// 下面是向文件file2里面写数据
try {
FileWriter fileWriter = new FileWriter(file2);
String s = new String("This is a test! \n" + "aaaa");
fileWriter.write(s);
fileWriter.close(); // 关闭数据流
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
/*
* 这样写数据的话,是完全更新文件test里面的内容,即把以前的东西全部删除,重新输入。
* 如果不想删除以前的数据,而是把新增加的内容增添在文件末尾处。只需要在创建FileWriter对象时候,使用另外一个构造函数即可:
* FileWriter fileWriter=new FileWriter(file2,true);
*/
// 下面是从文件file2读东西
try {
FileReader fileReader = new FileReader(file2);
String s = null;
char ch;
try {
char[] c = new char[100];
fileReader.read(c,0,2); // 具体想得到文件里面的什么值(单个char?int?还是String?),
System.out.println(c);
fileReader.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
/**
* 具体想得到文件里面的什么值(单个char?int?还是String?),需要知道不通read的不同用法:
* 1. int read() 读取单个字符。
* 2. int read(char[] cbuf) 将字符读入数组。 可以再将字符型数组转化位字符串
* 3. int read(char[] cbuf,int off,int len) 将字符读入数组的某一部分。
* 这三个方法都返回一个int值,作用是:读取的字符数,如果已到达流的末尾,则返回 -1.
*/
}
‘伍’ java输入输出流的本质是什么
Java输入输出流的本质是I/O操作,是指使用Java进行输入输出操作。Java所有的I/O机制都是基于数据流进行输入输出,这些数据流表示了字符或者字节数据的流动序列。Java的I/O流提供了读写数据的标准方法。任何Java中表示数据源的对象都会提供以数据流的方式读写它的数据的方法。
‘陆’ java输入输出流与文件,求源代码!感谢大佬!
你好,java的API中提供了用于对象输入输出文件的操作,实例代码如下:
定义单词类如下(注意:你定义的类要实现Serializable接口)
public class Words implements Serializable {
private int size;
private String[] words;
public Words(){};
public Words(String...strs){
this.words = strs;
this.size = strs.length;
}
@Override
public String toString() {
return "Words{" +
"size=" + size +
", words=" + Arrays.toString(words) +
'}';
}
}
2. 对象输入输出api测试类
public class ObjIOTest {
public static void main(String[] args) {
String path = "d:/myIOTest.txt";
ObjIOTest objIOTest = new ObjIOTest();
Words words = new Words("hello", "my", "dear", "friend");
try {
objIOTest.writeObject(path,words);
Words wordsFromFile = (Words)objIOTest.readObject(path);
System.out.println(wordsFromFile.toString());
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
//java serialize a object to file
public void writeObject(String path,Object map) throws IOException{
File f=new File(path);
FileOutputStream out=new FileOutputStream(f);
ObjectOutputStream objwrite=new ObjectOutputStream(out);
objwrite.writeObject(map);
objwrite.flush();
objwrite.close();
}
// read the object from the file
public Object readObject(String path) throws IOException, ClassNotFoundException{
FileInputStream in=new FileInputStream(path);
ObjectInputStream objread=new ObjectInputStream(in);
Object map=objread.readObject();
objread.close();
return map;
}
}
把两段代码拷贝到一个包下即可运行了,希望您的问题得到解答
‘柒’ java怎么区分输入流和输出流
这个是依照内存为标准的,以加载磁盘上的文件到内存为例, 首先你必须把 磁盘上的文件,加载到 内存中,这个就是输入到内存, 你把内存里的文件,写到磁盘上,这个是把内存输出到磁盘上, 以内存为标准,写进内存,就是输入, 内存本身有内容,输出到别的地方,就是输出,一些网络的输入输出流,跟这个是一样的概念,以 客户端发送HTTP请求为例,客户端准备好了HTTP请求的内容,发送给服务器,这个就是输出流, 服务器返回一些内容,写进你本地的内存,这个就是输入,但是对于服务器来说,这个又是不一样的,你的请求对服务器来说,是输入,服务器给你的内容就是输出了。一端的输入,对于另一端来说就是输出,一端的输出,对另一端就是输入。
‘捌’ 什么是java输入输出流
Java把这些不同来源和目标的数据都统一抽象为数据流。
Java语言的输入输出功能是十分强大而灵活的,美中不足的是看上去输入输出的代码并不是很简洁,因为你往往需要包装许多不同的对象。
‘玖’ JAVA的输入输出流有多少种
在“面向对象编程:Java collection更有效管理elements”一文中,我们讨论了Java 集合类架构中的类和功能并介绍了它的排序功能。在本文中,我们将学习Java 平台提供的这些I/O类,接口和操作。让我们先从了解Java 数据流开始。 数据流Java所有的I/O机制都是基于数据流的,这些数据流表示了字符或者字节数据的流动序列。Java的I/O流提供了读写数据的标准方法。任何Java中表示数据源的对象都会提供以数据流的方式读写它的数据的方法。 Java.io是大多数面向数据流的输入/输出类的主要软件包。这个软件包包含了两个抽象类,InputStream和OutputStream。所有其它面象数据流的输入/输出类都要扩展这两个基类。 java.io软件包提供了一些类和接口,它们在由InputStream和OuputStream类提供的读写操作的顶端定义了一些有用的抽象。例如,ObjectInputStream类提供了让你把输入/输出流中的数据当成对象来读取的方法,而ObjectOutputStream类提供了让你能够把Java对象写入数据流中的方法。 优化读写过程 JDK 1.1 增加了一套读写类,它们提供了比现有数据流类更有用的抽象和更好的输入/输出性能。例如,BufferedReader和BufferedWriter 类被用来从基于字符的输入和输出流中读取和写入文本。BufferdReader 类缓存字符以更高效的读取字符串,数组和文本行。BufferedWriter类缓存字符以更高效的写入字符串,数组和文本行。BufferedReader和BufferedWriter 类可以按需求进行设置。 Java输入/输出架构提供的读取器和写入器类包括 LineNumberReader 类,CharArrayReader类,FileReader类,FilterReader类,PushbackReader类,PipedReader类,StringReader类以及其它一些类。这些类是在InputStream和OuputStream类顶部的包裹类因此提供了与InputStream和OuputStream类相似的方法。但是,这些类为读写特定的对象,比方文件,字符数组和字符串等等提供了更高效而有用的抽象。 读取数据当你从一个相应的数据源对象里提取输入流或者是创建一个读取器对象的时候就会自动打开一个输入流。例如,要为一个文件打开输入流,我们只需要以下面的方式把文件名传递给Java.io.FileReader对象的构造函数: java.io.FileReader fileReader = new java.io.FileReader(/home/me/myfile.txt); 要按顺序读取FileReader底层的输入流中的一个字节数据,只需要使用不带参数的read方法。表A中的代码段从一个文件读取文本数据,一次一个字符,然后把它写入System.out里。 要从输入流读取指定数目的字节数据到char数组里,只需要使用带一个char[]参数的read方法。数组的长度被用来确定应该读取的字符的个数。表B演示了这个技术。 要关闭一个输入流以及这个流使用的所有系统资源,你只需要以下面的方式调用close方法: fileReader.close();写入数据象一个输入流一样,输出流通常在你从相应的数据源提取它或者是在你创建一个写入对象的时候被自动的打开。例如,要为一个文件打开输出流,我们把文件的名字传递给java.io.FileWriter对象的构造函数,如下所示: java.io.FileWriter fileWriter = new java.io.FileWriter(/home/me/out.txt); 要将一个特定的字符写入到输出流中,可以使用带一个int参数的write方法,int参数代表要定入的字符。 int aChar = (int)'X'; fileWriter.write(aChar); 要在输出流给定的偏移地址写入一个char数组中特定数目的字符,你可以使用带一个char[]参数,一个int 偏移量参数和一个int长度参数的write方法,如下面的例子所示: fileWriter.write(buffer, 0, byteCount); 要关闭一个输出流并释放所有与之相关的系统资源,可以使用close方法,就象这样: fileWriter.close(); 要强迫写出一个输出流中的所有数据,可以使用下面的flush方法: fileWriter.flush(); 把它们全部综合起来 我们可以使用我们学习过的这些函数从一个文件中读取数据并同时写到另一个文件中去,如表C所示。 总结Java的输入/输出机制为从不同的数据源读取和写入字符增加了一套简单而标准化的API。你对一种数据源使用Java流的经验能够让你容易的使用其它由Java提供的数据源类型。
‘拾’ java中的输入输出流该怎么理解
数据流是一串连续不断的数据的集合,就象水管里的水流,在水管的一端一点一点地供水,而在水管的另一端看到的是一股连续不断的水流。数据写入程序可以是一段、一段地向数据流管道中写入数据,这些数据段会按先后顺序形成一个长的数据流。对数据读取程序来说,看不到数据流在写入时的分段情况,每次可以读取其中的任意长度的数据,但只能先读取前面的数据后,再读取后面的数据。不管写入时是将数据分多次写入,还是作为一个整体一次写入,读取时的效果都是完全一样的。
“流是磁盘或其它外围设备中存储的数据的源点或终点。”
在电脑上的数据有三种存储方式,一种是外存,一种是内存,一种是缓存。比如电脑上的硬盘,磁盘,U盘等都是外存,在电脑上有内存条,缓存是在CPU里面的。外存的存储量最大,其次是内存,最后是缓存,但是外存的数据的读取最慢,其次是内存,缓存最快。这里总结从外存读取数据到内存以及将数据从内存写到外存中。对于内存和外存的理解,我们可以简单的理解为容器,即外存是一个容器,内存又是另外一个容器。那又怎样把放在外存这个容器内的数据读取到内存这个容器以及怎么把内存这个容器里的数据存到外存中呢?
在Java类库中,IO部分的内容是很庞大的,因为它涉及的领域很广泛:
标准输入输出,文件的操作,网络上的数据流,字符串流,对象流,zip文件流等等,java中将输入输出抽象称为流,就好像水管,将两个容器连接起来。将数据冲外存中读取到内存中的称为输入流,将数据从内存写入外存中的称为输出流。
流是一个很形象的概念,当程序需要读取数据的时候,就会开启一个通向数据源的流,这个数据源可以是文件,内存,或是网络连接。类似的,当程序需要写入数据的时候,就会开启一个通向目的地的流。