输入输出下

9.3.3 文件字节流

InputStream和OutputStream 都是抽象类不能实例化,因此在实际的应用中都使用的是它们的子类,这些子类在实现其超类方法的同时又定义了特有的功能,用于不同的场合。

FileInputStream 用于顺序访问本地文件,从超类继承read、close方法,对文件进行操作。

FileOutputStream 用于向一个本地文件写数据。它从超类继承write和close方法。

public class FileStreamCopy {

public static void main(String[] args) throws IOException {

int size;

// 声明实例化输入流对象

FileInputStream f = new FileInputStream("E:/Java知识总结/HTML标签.txt");

// 声明实例化输出流对象

FileOutputStream fout = new FileOutputStream("E:/Java知识总结/copyHTML标签.txt");

System.out.println("Total Available Bytes: " + (size = f.available()));

int n = size / 30;

System.out.println("First " + n + " byte of the file one read() at a time");

// 使用read() 和write()

for (int i = 0; i < n; i++) {

fout.write(f.read());

}

System.out.println("Still Available: " + f.available());

System.out.println("Reading the next " + n + "with one read(b[])");

byte b[] = new byte[n];

if (f.read(b) != n) {

System.out.println("couldn‘t read " + n + "bytes");

}

fout.write(b);

System.out.println("Still Available:" + f.available());

System.out.println("Reading the rest bytes with read(b[],offset,len)");

int count = 0;

// 循环读取

while ((count = f.read(b, 0, n)) != -1) {

fout.write(b, 0, n);

}

System.out.println("Still Available:" + f.available());

// 关闭流

f.close();

fout.flush();

fout.close();

}

}

9.3.4 过滤流

过滤流在读/写数据的同时可以对数据进行处理,它提供了同步机制,使得某一时刻只有一个线程可以访问一个I/O流,以防止多个线程同时对一个I/O流进行操作带来的意想不到的结果。

过滤流扩展了输入输出流的功能,典型的扩展是缓冲、字符字节转换和数据转换。为了提高数据的传输效率,为一个流配备缓冲区(Buffer),称为缓冲流。

当向一个缓冲流写入数据时,系统将数据发送到缓冲区,而不是直接发送到外部设备,缓冲区自动记录数据。当缓冲区满时,系统将全部数据发送到外部设备。

当从一个缓冲区读取数据时,系统实际上从缓冲区中读取数据。当缓冲区空时,系统自动从相关设备读取数据,并读取尽可能多的数据充满缓冲区。

常用的缓冲输入流有:

BufferedInputStream,DataInputStream,pushbackInputStream,

常用的缓冲输入流有:

BufferedOutputStream,DataOutputSteam,pushbackOutputStream

9.3.5 随机存取文件

对于InputStream 和OutputStream,它们都是顺序访问流,从头至尾访问流,并且输入流只能读,不能写,输出流只能写不能读,即对一个文件不能同时进行读写。

RandomAccessFile类提供了一种称为“随机访问文件”方式,可以:对一个文件同时进行读写操作,可以在文件的任意位置进行读写操作。

主要的方法:

Public long length() :返回文件的长度

Void setLength(long newLength) :设置文件的新长度

Public void seek(long pos) :改变文件指针的位置

Public final int readInt():读入一个整数类型

Public final void writeInt(int v):写一个整数

Public long getFilePoint():获取文件指针位置

Public int skipBytes(int n):跳过n个字节

Close() 关闭文件

public class RandomFileDemo {

public static void main(String[] args) {

String fileName = "raf.txt";

RandomAccessFile raf = null;

String str1 = "this is a file.";

String str3 = "中华人民共和国";

long length, pos;

try {

// 构建对象

raf = new RandomAccessFile(fileName, "rw");

raf.writeChars(str1);

pos = raf.getFilePointer();

length = str1.length();

System.out.println("第一字符串的长度是:" + length);

// 一个字符用两个字节表示,内存中的表示和文件中的表示一致

System.out.println("写入一个字符串后,文件指针:" + pos);

// 又写入了一个字符串,重置指针位置,读取字符

System.out.println("第二个字符串");

pos = raf.getFilePointer();

// 写入字符串

raf.writeChars(str3);

raf.seek(pos);

for (int i = 0; i < str3.length(); i++) {

System.out.print(raf.readChar());

}

pos = raf.getFilePointer();

System.out.println("\n 写入" + str3.length() + "字符后,文件指针:" + pos);

System.out.println("文件测试成功");

} catch (FileNotFoundException e) {

System.out.println("文件不存在");

} catch (IOException e) {

e.printStackTrace();

}

}

}

9.4 字符流处理

尽管字节流提供了处理任何数据类型的输入输出操作的功能,但它们不能直接操作Unicode字符。提供直接的字符输入输出支持是必要的。

9.4.1 Scanner 字符流

Scanner是一个可以使用正则表达式来解析基本类型和字符串的简单文本扫描器。Scanner使用分隔符模式将其输入分解为标记,默认情况下该分隔符模式与空白匹配。然后可以使用不同的next方法得到的标记转换成不同类型的值,在读取下一个标记之前可以使用hasNext方法检测一下。

 

public class ScannerDemo {

private static int getLineSum(String strLine) {

Scanner s = new Scanner(strLine);

int sum = 0;

while (s.hasNextInt()) {

sum += s.nextInt();

}

return sum;

}

public static void main(String[] args) {

Scanner s = null;

PrintWriter pw = null;

try {

// 从源文件输入,使用Scanner读入由空白字符分割的文本文件内容是很方便的

s = new Scanner(new File("E:/Java知识总结/test.txt"));

// 使用PrintWriter进行格式化输出

pw = new PrintWriter("E:/Java知识总结/text02.txt");

while (s.hasNextLine()) {

String strLine = s.nextLine();

// 调用方法求每一行的和

int sum = getLineSum(strLine);

// 写到文件上

pw.println(strLine + "\t" + sum);

}

} catch (FileNotFoundException e) {

e.printStackTrace();

} finally {

if (s != null) {

s.close();

}

if (pw != null) {

pw.close();

}

}

}

}

 

时间: 2024-10-10 22:29:06

输入输出下的相关文章

ACM做题过程中的一些小技巧

1.一般用C语言节约空间,要用C++库函数或STL时才用C++; cout.cin和printf.scanf最好不要混用. 2.有时候int型不够用,可以用long long或__int64型(两个下划线__). 值类型表示值介于 -2^63 ( -9,223,372,036,854,775,808) 到2^63-1(+9,223,372,036,854,775,807 )之间的整数. printf("%I64d",a); printf("%lld",a); 3.O

CentOS下输入输出重定向

nux重定向是指修改原来默认的一些东西,对原来系统命令的默认执行方式进行改变,比如说简单的我不想看到在显示器的输出而是希望输出到某一文件中就可以通过Linux重定向来进行这项工作. Linux默认输入是键盘,输出是显示器.你可以用重定向来改变这些设置.比如用wc命令的时候本来是要手动输入一篇文字来计算字符数的,用了重定向后可以直接把一个已经写好的文件用‘<’指向这条命令,就直接可以统计这个文件的字符数等了.输出也是一样,你可以把屏幕输出重定向到一个文件里,再到文件里去看结果.重定向操作符可以用来

linux kernel下输入输出console怎样实现

近期工作在调试usb虚拟串口,让其作为kernel启动的调试串口,以及user空间的输入输出控制台. 利用这个机会,学习下printk怎样选择往哪个console输出以及user空间下控制台怎样选择.记录与此.与大家共享,也方便自己以后翻阅. Kernel版本号号:3.4.55 按照我的思路(还是时间顺序)分了4部分,指定kernel调试console ,  kernel下printk console的选择 ,kernel下console的注冊.user空间console的选择. 一 指定ker

【python下使用OpenCV实现计算机视觉读书笔记1】输入输出

亲爱的网友,我这里有套课程想和大家分享,如果对这个课程有兴趣的,可以加我的QQ2059055336和我联系. 课程内容简介 我们软件是基于移动设备的.所以我们必然的选择了安卓作为我们的开发工具.课程中,我们将简要的介绍Android的基本概念,然后进行我们的实战开发.在开发中,大家讲学习到基本的组件,适配UI,数据的存储,多线程下载,开机广播,闹钟提醒,短信发送等实际项目开发中碰到的有用的知识点.通过课程学习,让大家能够掌握Android软件开发的流程,注意点,及优化.帮助大家迅速的掌握Andr

linux kernel下输入输出console如何实现

最近工作在调试usb虚拟串口,让其作为kernel启动的调试串口,以及user空间的输入输出控制台. 利用这个机会,学习下printk如何选择往哪个console输出以及user空间下控制台如何选择,记录与此,与大家共享,也方便自己以后翻阅. Kernel版本号:3.4.55 依照我的思路(还是时间顺序)分了4部分,指定kernel调试console ,  kernel下printk console的选择 ,kernel下console的注册,user空间console的选择. 一 指定kern

让Jayrock插上翅膀(加入输入输出参数注释,测试页面有注释,下拉框可以搜索)

继上一篇文章介绍了Jayrock组件开发接口的具体步骤和优缺点之后,今天给大家带来的就是,如何修复这些缺点. 首先来回顾一下修复的缺点有哪些: 1.每个接口的只能写大概的注释,不能分开来写,如接口的主要功能,输入的参数是什么意思,输出的字段是什么意思. 2.测试页面中,针对每个接口的功能注释是没有的,这样非常不方便,因为接口一多,开发人员很难快速的定位要使用的接口. 3.测试页面中,选择的下拉框不能输入搜索,只能一个个选择,接口一多,绝对是个悲剧的活. 那么下面就展示我是如何修复这些缺点的: 1

回顾下输入输出

#include <stdio.h>int main(void){char name[20];int age;int zc;printf("请输入你的姓名:");scanf("%s",name);printf("请输入你的年龄:");scanf("%d",&age);printf("请输入你的邮政编码:");scanf("%d",&zc);printf(&qu

Linux下串口编制【转】

串行口是计算机一种常用的接口,具有连接线少,通讯简单,得到广泛的使用.常用的串口是RS-232-C接口(又称EIA RS-232-C)它是在1970年由美国电子工业协会(EIA)联合贝尔系统.调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准.串口通讯指的是计算机依次以位(bit)为单位来传送数据,串行通讯使用的范围很广,在嵌入式系统开发过程中串口通讯也经常用到通讯方式之一. Linux对所有设备的访问是通过设备文件来进行的,串口也是这样,为了访问串口,只需打开其设备文件即可操作串口

linux下select函数详解及实例

一.概述: 系统提供select函数来实现I/O复用输入/输出模型.select系统调用是用来让我们的程序监视多个文件句柄的状态变化的.程序会停在select这里等待,直到被监视的文件句柄中有一个或多个发生生了状态改变. 二.select函数: 以下为man文本中的解释:  /* According to POSIX.1-2001 */        #include <sys/select.h>        /* According to earlier standards */