Java之输入输出流(文件的读写)
Java之输入输出流(文件的读写)
首先,在编程的世界,流明显显得很重要。C++的输入输出流,Java的输入输出流等等。
首先我们得学会如何使用Java的输入输出流。首先,它们被封装在Java的一个叫做java.io的包中,编程时也必须导入此包。
我们首先编写一个程序,此程序能够简单的使用到Java语言的输入输出流。
编写一个简单的文件写入 和读出的操作。(源代码如下)
importjava.io.*;
publicclassTest1 {
publicstaticvoidmain(String[] args) throwsIOException {
StringfilePath = "D:\\c.txt";
FileWriterwriter = newFileWriter(filePath);
writer.write("HelloMy name is Jack_Li.\r\n"); //可以写入英文
writer.write("你好,我的名字是杰克.\r\n"); //也可以写入中文 字节码内部转换
writer.close();
}
}
运行以上程序,即可在D盘下建立一个c.txt文件,并且显示的内容即为程序中写入的内容。
好了,我们现在剖析一下程序,首先,在文件写入和读出过程中,可能会出现,文件写入或读出的错误,一般会使用异常。这里简单的抛出一个IO异常,现在是FileWriter这个类是干嘛的?
打开JDK(这里版本是1.6.0),文档如是道:
publicclass FileWriter
extendsOutputStreamWriter
用来写入字符文件的便捷类。此类的构造方法假定默认字符编码和默认字节缓冲区大小都是可接受的。要自己指定这些值,可以先在FileOutputStream上构造一个OutputStreamWriter。
文件是否可用或是否可以被创建取决于底层平台。特别是某些平台一次只允许一个FileWriter(或其他文件写入对象)打开文件进行写入。在这种情况下,如果所涉及的文件已经打开,则此类中的构造方法将失败。
FileWriter用于写入字符流。要写入原始字节流,请考虑使用FileOutputStream。
我们可以清洗的看见大它的功能是什么。
这个类的方法主要包括从java.io.OutputStreamWriter继承的方法,从java.io.Writer继承的方法,从java.lang.Object继承的方法(此方法所有类都继承),使用时便可查阅文档。
现在介绍一下文件的读出操作。请看源代码
importjava.io.*; //进行数据的读取
publicclassTest2 {
publicstaticvoidmain(String[] args) throwsIOException{
StringfilePath = "D:\\c.txt";
Stringline;
BufferedReaderin= newBufferedReader(newFileReader(filePath));
line= in.readLine();
while(line!= null)
{
System.out.println(line);
line= in.readLine();
}
in.close();
}
}
此时文件的读取使用了BufferedReader类,此类进行文件的读取比较方便而且高效。(类的情况介绍详见JDK)。
文件输入输出的扩展,首先我们可以简单的编写一个单文档程序,模拟文件中的打开和保存功能,并且添加基本的复制,粘贴,剪贴功能。
源程序如下:
importjava.awt.*;
importjava.awt.event.*;
importjava.io.*;
importjavax.swing.*; //利用JTextArea 此类方法比较多
importjava.util.Date;
importjava.text.SimpleDateFormat;
classeditMenu
{
privateJFrame f;
privateJTextArea ta;
privateJMenuBar mb;
privateJMenu editMenuItem;
privateJMenuItem copyMenuItem; //复制
privateJMenuItem cutMenuItem; //剪贴
privateJMenuItem pastMenuItem; //粘贴
privateJMenuItem timeMenuItem;
editMenu(JFramef,JMenuBar mb,JTextArea ta)
{
this.f= f;
this.mb= mb;
this.ta= ta;
initAllEditMenu();
editEvent();
}
privatevoidinitAllEditMenu()
{
editMenuItem= newJMenu("编辑");
copyMenuItem= newJMenuItem("复制");
cutMenuItem= newJMenuItem("剪贴");
pastMenuItem= newJMenuItem("粘贴");
timeMenuItem= newJMenuItem("时间");
editMenuItem.add(copyMenuItem);
editMenuItem.add(cutMenuItem);
editMenuItem.add(pastMenuItem);
editMenuItem.add(timeMenuItem);
mb.add(editMenuItem);
}
privatevoideditEvent()
{
copyMenuItem.addActionListener(newActionListener() //复制按钮的响应事件
{
publicvoidactionPerformed(ActionEvent e)
{
ta.copy();
}
}
);
cutMenuItem.addActionListener(newActionListener() //剪贴按钮的响应事件
{
publicvoidactionPerformed(ActionEvent e)
{
ta.cut();
}
}
);
pastMenuItem.addActionListener(newActionListener() //粘贴按钮的响应事件
{
publicvoidactionPerformed(ActionEvent e)
{
ta.paste();
}
}
);
timeMenuItem.addActionListener(newActionListener()
{
publicvoidactionPerformed(ActionEvent e)
{
SimpleDateFormatdf = newSimpleDateFormat("yyyy-MM-ddHH:mm:ss");
StringstrTime = df.format(newDate());
ta.append(strTime);
}
}
);
}
}
classfileMenu
{
privateJFrame f;
privateJTextArea ta;
privateJMenuBar mb;
privateJMenu fileMenuItem;
privateJMenuItem openMenuItem;
privateJMenuItem saveMenuItem;
privateJMenuItem exit;
fileMenu(JFramef,JMenuBar mb,JTextArea ta)
{
this.f= f;
this.ta= ta;
this.mb= mb;
initAllFileMenu();
fileEvent();
}
privatevoidinitAllFileMenu()
{
fileMenuItem= newJMenu("文件");
openMenuItem= newJMenuItem("打开");
saveMenuItem= newJMenuItem("保存");
exit= newJMenuItem("退出");
fileMenuItem.add(openMenuItem);
fileMenuItem.add(saveMenuItem);
fileMenuItem.add(exit);
mb.add(fileMenuItem);
}
privatevoidfileEvent()
{
exit.addActionListener(newActionListener() //退出按钮的响应事件
{
publicvoidactionPerformed(ActionEvent e)
{
System.exit(0);
}
}
);
openMenuItem.addActionListener(newActionListener()
{
publicvoidactionPerformed(ActionEvent e)
{
FileDialogopenDlg = newFileDialog(f,"打开",FileDialog.LOAD);
openDlg.setVisible(true);
StringstrPath = openDlg.getDirectory();
StringstrFile = openDlg.getFile();
StringfilePath = strPath+strFile;
ta.setText(""); //保障当前区域为空
try
{
BufferedReaderbf = newBufferedReader(newFileReader(filePath));
StringdataInput = null;
while((dataInput= bf.readLine()) != null)
{
ta.append(dataInput+"\r\n"); //加上\r\n表示windows文件的结束标志
}
bf.close();
}
catch(IOExceptionee)
{
thrownewRuntimeException("打开文件有错误");
}
}
}
);
saveMenuItem.addActionListener(newActionListener()
{
public voidactionPerformed(ActionEvent e)
{
StringstrPath = f.getTitle(); //获取文件的名称
strPath+= ".txt"; //设置为txt文档
try{
BufferedWriterbw = newBufferedWriter(newFileWriter(strPath));
Stringdata = ta.getText();
bw.write(data);
bw.close();
}
catch(Exceptionee)
{
newRuntimeException("保存失败");
}
}
}
);
}
}
classMyFrame
{
privateJFrame noteFrame;
privateJMenuBar mb;
privateJTextArea ta; //表示文本区域
publicMyFrame()
{
InitAll();
}
privatevoidInitAll()
{
noteFrame= newJFrame("单文档程序练习");
mb= newJMenuBar();
ta= newJTextArea();
noteFrame.setSize(800,600);
noteFrame.setLocation(200,80);
newfileMenu(noteFrame,mb,ta);
neweditMenu(noteFrame,mb,ta);
noteFrame.setJMenuBar(mb);
noteFrame.add(ta);
frameEvent();
noteFrame.setVisible(true);
}
privatevoidframeEvent()
{
noteFrame.addWindowListener(newWindowAdapter()
{
publicvoidwindowClosing(WindowEvent e)
{
System.exit(0);
}
}
);
}
}
publicclassProject {
publicstaticvoidmain(String[] args) {
newMyFrame();
}
}
正好,此时我们已经完成一个简单单文档的制作,(有兴趣的朋友可以对其添加功能,使得和Windows的notepad想媲美,不过个人觉得这个有点浪费时间,觉得效率太低。以后哥们会拿出Win32编写的单文档程序)。
基本输入输出流失可以干大事的。
现在我们利用输入输出流,简单模拟一下FTP程序的文件上传功能。
从客户端上传到服务器端。首先选择一下协议(由于文件传输过程中要保证数据的完整性,所以应该使用TCP/IP协议)
importjava.io.*;
importjava.net.*;
classFileClient
{
publicstaticvoidmain(String args[]) throwsException
{
Sockets = newSocket("127.0.0.1",10004);
BufferedReader br = newBufferedReader(
newFileReader("D:\\Client.txt"));
PrintWriterout = newPrintWriter(s.getOutputStream(),true);
Stringline = null;
while((line=br.readLine())!= null)
{
out.println(line);
}
out.println("over"); //输出一个结束标志
BufferedReaderbufIn = newBufferedReader(
newInputStreamReader(s.getInputStream()));
Stringstr = bufIn.readLine();
System.out.println(str);
br.close();
s.close();
}
}
classFileServer
{
publicstaticvoidmain(String args[]) throwsException
{
ServerSocketss = newServerSocket(10004);
Sockets = ss.accept();
BufferedReaderbr = newBufferedReader(
newInputStreamReader(s.getInputStream()));
PrintWriterout = newPrintWriter(newFileWriter("D:\\Server.txt"),true);
Stringstr= null;
while((str=br.readLine()) != null) //防止卡死 发送一个结束标志
{
if(str.equals("over"))
break;
out.println(str);
}
PrintWriterpw = newPrintWriter(s.getOutputStream(),true);
pw.println("Sendfile successfully!");
br.close();
s.close();
}
}
Java之输入输出流(文件的读写)相关推荐
- Java高效输入输出流讲解
Java高效输入输出流讲解 Java中执行输出和输入操作,需要通过IO流.例如最常见的System.out.println()就是一个输出流.IO流的类比较多,但核心体系就是由File. InputS ...
- 《Java核心技术 卷II》笔记——(7)输入/输出流文件流序列化
Java的输入和输出通过数据流.序列化和文件系统提供: 输入/输出流?字节流与字符流? 按流向分-- 输入流: 程序可以从中读取数据的流. 输出流: 程序能向其中写入数据的流. 标准输入输出,文件的操 ...
- java实验 输入输出流_java实验七 输入输出流
有关java的实验和程序 实验七 输入输出流 一.实验目的和要求 目的: 1.掌握使用输入输出流进行文件的读写操作. 要求: 1.实验报告给出内容1,2的填充代码以及内容3的全部源代码. 二.实验内容 ...
- java回忆录—输入输出流详细讲解(入门经典)
今天我们开始进入学习 java 中比较让人头疼的事, 那就是 I/O 流.多线程.网络编程.这里对 I/O 流的一个详细讲解.希望对大家有点用吧.(不看后悔哦) 一.什么是IO Java中I/O操作主 ...
- java 使用NIO进行文件的读写
前言 在NIO中使用FileChannel 用于文件数据的读写 FileChannel方法 public int read(ByteBuffer dst) 从通道读取数据并放到缓冲区中,此操作也会移动 ...
- Java(2)-Java IO输入输出流
一.什么是IO Java中I/O操作主要是指使用Java进行输入,输出操作. Java所有的I/O机制都是基于数据流进行输入输出,这些数据流表示了字符或者字节数据的流动序列.Java的I/O流提供了读 ...
- C++ 输入输出流 文本文件 二进制文件读写
文本文件/ASCII文件(能直接显示内容,费存储空间):文件中每一个字节中均以ASCII代码形式存放数据,即一个字节存放一个字符,这个文件就是ASCII文件或称字符文件. 二进制文件(不能显示内容,节 ...
- java开发教程-excel文件的读写
全栈工程师开发手册 (作者:栾鹏) java教程全解 excel文件的读写,需要使用jxl包,使用示例. jxl包下载 myfile.xls import java.io.File; import j ...
- Java入门—输入输出流
File类的使用 文件是:文件可认为是相关记录或放在一起的数据的集合. Java中,使用java.io.File类对文件进行操作 public class FileDemo {public stati ...
最新文章
- 某字节程序员求助:家庭条件比leader好很多,leader还没买房,但自己已准备买车买房,会不会被仇富?网友:收敛点,别露富!...
- Flutter ------- WebView加载网页
- 高质量程序设计指南c++/c语言(33)--函数指针
- python 离线翻译软件_AI赋能翻译,讯飞这个设备轻松搞定国际交流
- [Java基础]ListIterator
- 并不对劲的BJOI2019
- matlab简易编程,MATLAB简单编程
- iOS 中的视图函数 init initwithnib viewDidLoad viewWillAppear的总结
- 亭台六七座,八九十枝花——python正则表达
- SSM项目实战之十一:用户信息的添加
- 目标跟踪数据集VOT环境详细配置过程(附部分tracker融合代码)
- OEM/ODM/OBM
- mysql hash索引 btree索引_HASH索引做等值查询会很快,BTree索引做范围查询比较快...
- vue的两个核心点分别是什么?
- Mac下的SVN客户端
- [Lecture 8 ] Deep Learning Software(深度学习软件)
- hdmi接口线_HDMI接口不可以传输音频吗?带你快速了解HDMI接口
- 从Foxmail向Thunderbird(TB)导出邮件
- 2018伦敦市长交通战略
- 数据库被占用怎么办?