为什么要用文件输入流
‘壹’ 文件输入流疑惑
当然不是异常了.
package wjf;
import java.io.*;
public class Fis
{
public static void main(String[] args) throws Exception
{
FileInputStream fis=new FileInputStream("Fis.java");
byte[] b=new byte[100];
int c;
while((c=fis.read(b))!=-1)
{
System.out.println("c="+c);
}
}
}
打印结果如下:
c=100
c=100
c=88.
查查API,自己理解一下才行.
‘贰’ 用Java和上传文件到数据库 上传时只用到了输入流 为啥下载时用到了输入流和输出流
代码如下:importjava.io.*;/***复制文件夹或文件夹*/publicclassCopyDirectory{//源文件夹staticStringurl1="f:/photos";//目标文件夹staticStringurl2="d:/tempPhotos";publicstaticvoidmain(Stringargs[])throwsIOException{//创建目标文件夹(newFile(url2)).mkdirs();//获取源文件夹当前下的文件或目录File[]file=(newFile(url1)).listFiles();for(inti=0;i
‘叁’ 到底什么时候用输入流,什么时候用输出流
打开外文件使用输入流,
保存文件到磁盘输出流。
‘肆’ java 为什么用文件输入流写97进去,文件中却显示的是a
你这个不是输入流,你这个叫输出流好不好?
方向是根据内存来判定的,从内存写入到硬盘,就是输出流;从硬盘写到内存,就是输入流;
首先,97转成二进制,1100001,交给虚拟机-操作系统调用方法写入到你这个构造方法指定的位置。由于常用编辑器会在打开的时候,将字节转换为字符显示,1-127之间的会查询ASCII码表,会显示为a,其它值则查询系统默认的码表,如果是中文,则查询gbk码表。
如果你要写入97,可以将97转换为String类型,调用getbytes()方法得到一个数组,写入就行
‘伍’ 图书管理系统c++为什么要用到文件输出流
掌握输入/输出流
在这一章里,我会提及一些有用的函数。我将为你演示如何打开一个可以同时进行读、写操作的文件;此外,我还将为你介绍其它打开文件的方法,以及如何判断打开操作是否成功。因此,请接着往下读!
到目前为止,我已为你所展示的只是单一的打开文件的途径:要么为读取而打开,要么为写入而打开。但文件还可以以其它方式打开。迄今,你应当已经认识了下面的方法:
ifstream OpenFile(“cpp-home.txt”);
噢,这可不是唯一的方法!正如以前所提到的,以上的代码创建一个类ifstream的对象,并将文件的名字传递给它的构造函数。但实际上,还存在有不少的重载的构造函数,它们可以接受不止一个的参数。同时,还有一个open()函数可以做同样的事情。下面是一个以上代码的示例,但它使用了open()函数:
ifstream OpenFile;
OpenFile.open(“cpp-home.txt”);
你会问:它们之间有什么区别吗?哦,我曾做了不少测试,结论是没有区别!只不过如果你要创建一个文件句柄但不想立刻给它指定一个文件名,那么你可以使用open()函数过后进行指定。顺便再给出一个要使用open()函数的例子:如果你打开一个文件,然后关闭了它,又打算用同一个文件句柄打开另一个文件,这样一来,你将需要使用open()函数。
考虑以下的代码示例:
#include <fstream.h>
void read(ifstream &T) //pass the file stream to the function
{
//the method to read a file, that I showed you before
char ch;
while(!T.eof())
{
T.get(ch);
cout << ch;
}
cout << endl << "--------" << endl;
}
void main()
{
ifstream T("file1.txt");
read(T);
T.close();
T.open("file2.txt");
read(T);
T.close();
}
据此,只要file1.txt和file2.txt并存储了文本内容,你将看到这些内容。
现在,该向你演示的是,文件名并不是你唯一可以向open()函数或者构造函数(其实都一样)传递的参数。下面是一个函数原型:
ifstream OpenFile(char *filename, int open_mode);
你应当知道filename表示文件的名称(一个字符串),而新出现的则是open_mode(打开模式)。open_mode的值用来定义以怎样的方式打开文件。下面是打开模式的列表:
名称
描述
ios::in
打开一个可读取文件
ios::out
打开一个可写入文件
ios::app
你写入的所有数据将被追加到文件的末尾,此方式使用ios::out
ios::ate
你写入的所有数据将被追加到文件的末尾,此方式不使用ios::out
ios::trunk
删除文件原来已存在的内容(清空文件)
ios::nocreate
如果要打开的文件并不存在,那么以此参数调用open()函数将无法进行。
ios::noreplace
如果要打开的文件已存在,试图用open()函数打开时将返回一个错误。
ios::binary
以二进制的形式打开一个文件。
实际上,以上的值都属于一个枚举类型的int常量。但为了让你的编程生涯不至于太痛苦,你可以像上表所见的那样使用那些名称。
下面是一个关于如何使用打开模式的例子:
#include <fstream.h>
void main()
{
ofstream SaveFile("file1.txt", ios::ate);
SaveFile << "That's new!\n";
SaveFile.close();
}
正如你在表中所看到的:使用ios::ate将会从文件的末尾开始执行写入。如果我没有使用它,原来的文件内容将会被重新写入的内容覆盖掉。不过既然我已经使用了它,那么我只会在原文件的末尾进行添加。所以,如果file1.txt原有的内容是这样:
Hi! This is test from www.cpp-home.com!
那么执行上面的代码后,程序将会为它添上“That’s new!”,因此它看起来将变成这样:
Hi! This is test from www.cpp-home.com!That’s new!
假如你打算设置不止一个的打开模式标志,只须使用OR操作符或者是 ,像这样:
ios::ate ios::binary
我希望现在你已经明白“打开模式”是什么意思了!
现在,是时候向你展示一些真正有用的东西了!我敢打赌你现在还不知道应当怎样打开一个可以同时进行读取和写入操作的文件!下面就是实现的方法:
fstream File(“cpp-home.txt”,ios::in ios::out);
实际上,这只是一个声明语句。我将在下面数行之后给你一个代码示例。但此时我首先想提及一些你应当知道的内容。
上面的代码创建了一个名为“File”的流式文件的句柄。如你所知,它是fstream类的一个对象。当使用fstream时,你应当指定ios::in和ios::out作为文件的打开模式。这样,你就可以同时对文件进行读、写,而无须创建新的文件句柄。噢,当然,你也可以只进行读或者写的操作。那样的话,相应地你应当只使用ios::in或者只使用ios::out —— 要思考的问题是:如果你打算这么做,为什么你不分别用ifstream及ofstream来实现呢?
下面就先给出示例代码:
#include <fstream.h>
void main()
{
fstream File("test.txt",ios::in ios::out);
File << "Hi!"; //将“Hi!”写入文件
static char str[10]; //当使用static时,数组会自动被初始化
//即是被清空为零
File.seekg(ios::beg); // 回到文件首部
// 此函数将在后面解释
File >> str;
cout << str << endl;
File.close();
}
OK,这儿又有一些新东西,所以我将逐行进行解释:
fstream File(“test.txt”, ios::in ios::out); —— 此行创建一个fstream对象,执行时将会以读/写方式打开test.txt文件。这意味着你可以同时读取文件并写入数据。
File << “Hi!”; —— 我打赌你已经知道它的意思了。
static char str[10]; —— 这将创建一个容量为10的字符数组。我猜static对你而言或者有些陌生,如果这样就忽略它。这只不过会在创建数组的同时对其进行初始化。
File.seekg(ios::beg); —— OK,我要让你明白它究竟会做些什么,因此我将以一些有点儿离题、但挺重要的内容开始我的解释。
还记得它么:
while(!OpenFile.eof())
{
OpenFile.get(ch);
cout << ch;
}
你是不是曾经很想知道那背后真正执行了什么操作?不管是或不是,我都将为你解释。这是一个while型循环,它会一直反复,直至程序的操作到达文件的尾端。但这个循环如何知道是否已经到了文件末尾?嗯,当你读文件的时候,会有一个类似于“内置指针(inside-pointer)”的东西,它表明你读取(写入也一样)已经到了文件的哪个位置,就像记事本中的光标。而每当你调用OpenFile.get(ch)的时候,它会返回当前位置的字符,存储在ch变量中,并将这一内置指针向前移动一个字符。因此下次该函数再被调用时,它将会返回下一个字符。而这一过程将不断反复,直到读取到达文件尾。所以,让我们回到那行代码:函数seekg()将把内置指针定位到指定的位置(依你决定)。你可以使用:
ios::beg —— 可将它移动到文件首端
ios::end —— 可将它移动到文件末端
或者,你可以设定向前或向后跳转的字符数。例如,如果你要向定位到当前位置的5个字符以前,你应当写:
File.seekg(-5);
如果你想向后跳过40个字符,则应当写:
File.seekg(40);
同时,我必须指出,函数seekg()是被重载的,它也可以带两个参数。另一个版本是这样子的:
File.seekg(-5,ios::end);
在这个例子中,你将能够读到文件文本的最后4个字符,因为:
1)你先到达了末尾(ios::end)
2)你接着到达了末尾的前五个字符的位置(-5)
为什么你会读到4个字符而不是5个?噢,只须把最后一个看成是“丢掉了”,因为文件最末端的“东西”既不是字符也不是空白符,那只是一个位置(译注:或许ios::end所“指”的根本已经超出了文件本身的范围,确切的说它是指向文件最后一个字符的下一个位置,有点类似STL中的各个容器的end迭代点是指向最后一个元素的下一位置。这样设计可能是便于在循环中实现遍历)。
你现在可能想知道为什么我要使用到这个函数。呃,当我把“Hi”写进文件之后,内置指针将被设为指向其后面……也就是文件的末尾。因此我必须将内置指针设回文件起始处。这就是这个函数在此处的确切用途。
File >> str; —— 这也是新鲜的玩意儿!噢,我确信这行代码让你想起了cin >> .实际上,它们之间有着相当的关联。此行会从文件中读取一个单词,然后将它存入指定的数组变量中。
例如,如果文件中有这样的文本片断:
Hi! Do you know me?
使用File >> str,则只会将“Hi!”输出到str数组中。你应当已经注意到了,它实际上是将空格作为单词的分隔符进行读取的。
由于我存入文件中的只是单独一个“Hi!”,我不需要写一个while循环,那会花费更多的时间来写代码。这就是我使用此方法的原因。顺便说一下,到目前为止,我所使用的读取文件的
========================
文件拷贝:
void file(const char* src,const char* des)
{
fstream infile(src,ios::binary);
fstream outfile(des,ios::binary); ;
outfile<< infile.rd_buf();
}
‘陆’ 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 io流按照java io流的方向可以分为输入流和输出流输入流是将资源数据读入到缓冲Buffer中,输出流是将缓冲Buffer中的数据按照指定格式写出到一个指定的位置,所以这两个流一般同时使用,才有意义。例如你要做文件的上传,你要先用输入流将待上传文件读入缓冲,然后用输出流将文件写出到网络服务器的一个位置,则上传成功;若是文件下载,则先获得输入流,来读取网络服务器中的一个文件,然后用输出流写到本地的一个文件中;还有例如文件的拷贝,也是先用输入流读再用输出流写出去的很好的例子,你可以先做一个小例子试试,对你理解java io有帮助
‘捌’ 为什么要再读取文件时使用FileinputStream函数
哥们,FileInputStream不是函数,是类。
FileInputStream 从文件系统中的某个文件中获得输入字节。哪些文件可用取决于主机环境。 FileInputStream 用于读取诸如图像数据之类的原始字节流。要读取字符流,请考虑使用 FileReader。 FileInputStream 包含其他一些输入流,它将这些流用作其基本数据源,它可以直接传输数据或提供一些额外的功能。 FileInputStream 类本身只是简单地重写那些将所有请求传递给所包含输入流的 InputStream 的所有方法。 FileInputStream 的子类可进一步重写这些方法中的一些方法,并且还可以提供一些额外的方法和字段。
‘玖’ 这里的System.in是返回的是字符串,为什么还要用InputStreamReader,这个流不是将字节转为字符串吗
System.in是标准输入文件的输入流,类型是InputStream,是个流。至于你说的“返回的是字符串”,你可能理解有误,你只是通过别的途径将这个输入流里的数据读取成字符串了。
InputSteamReader顾名思义是“输入流读取器”,不是“将字节转为字符串”。
‘拾’ struts2下载文件为什么提供一个输入流而不是输出流。
也有输出流啊,输入流是从该文件读入数据到缓存区中,输出流是把这些在从缓存区中输出到你创建的新文件中