使用java读写流为什么h盘拒绝访问_JAVA 中文件的读写 I/O 输入输出流

JAVA 中文件的读写 I/O 输入输出流

JAVA 中文件的读写 I/O 输入输出流

阅读 19

收藏 0

2018-02-17

主要内容

1. 编码问题

2.File 类的使用

3.RandomAccessFile 的使用

4.I/O 输入输出流

编码问题:

import java.io.UnsupportedEncodingException;

public class 编码问题 {publicstaticvoidmain(String[]args){

// 我们项目的默认编码是 GBK

Strings="测试 ABC";

byte[]byte1=s.getBytes();// 转换成的字节序列用的是项目默认的编码 gbk

for(byteb:byte1){

// 1 byte = 8 位 //toHexString 这个函数是把字节 (转换成了 Int) 以 16 进制的方式显示

System.out.print(Integer.toHexString(b&0xff)+" ");// &

// 0xff 是为了把前面的 24 个 0 去掉只留下后八位

}

try{

// 也可以转换成指定的编码

byte[]bytes1=s.getBytes("gbk");

System.out.println(newString(bytes1));

}catch(UnsupportedEncodingExceptione){

// TODO Auto-generated catch block

e.printStackTrace();

}

/**

* gbk 编码: 中文占用两个字节, 英文占用一个字节 utf-8 编码: 中文占用三个字节, 英文占用一个字节

* java 是双字节编码, 是 utf-16be 编码 utf-16be 编码: 中文占用两个字节, 英文占用两个字节

* 当你的字节序列是某种编码时, 这个时候想把字节序列变成字符串, 也需要用这种编码方式, 否则会出现乱码

*/

try{

byte[]byte2=s.getBytes("utf-16be");

Strings2=newString(byte2,"utf-16be");

System.out.println(s2);

}catch(UnsupportedEncodingExceptione){

// TODO Auto-generated catch block

e.printStackTrace();

}

/**

* 文本文件就是字节序列, 可以是任意编码的字节序列

* 如果我们在中文机器上直接创建文本文件, 那么该文件只认识 ANSI 编码(例如直接在电脑中创建文本文件)

*/

/**

* byte 转 int 的时候为什么非要先 & 0xff 计算出来才是正确答案?

* 首先, java 中的二进制采用的是补码形式, 并非原码或反码, 这 3 个概念要搞清楚;

* 其次, byte 占 8 位, int 占 32 位, 将 byte 强制转换为 int 型时, 如果没有做 &

* 0xff 运算, 且 byte 对应的值为负数的话, 就会对高位 3 个字节进行补位, 这样就有可能出现补位误差的错误

* 举例来说, byte 型的 - 1, 其二进制 (补码) 为 11111111(即 0xff), 转换成 int 型, 值也应该为 - 1, 但经过补位后,

* 得到的二进制为 11111111111111111111111111111111(即 0xffffffff), 这就不是 - 1 了, 对吧?

* 而 0xff 默认是 int 型, 所以, 一个 byte 跟 0xff 相与, 会先将那个 byte 转化成 int 型运算, 这样, 结果中的高位 3 个字节就总会被清 0,

* 于是结果就是我们想要的了~

*/

}

}

ViewCode

File 类的使用:

JAVA.io.File 类用于表示文件 (目录) File 类只用于表示文件( 目录) 的信息 (名称大小等), 不能用于文件内容的访问 File 类的常用 API: 1. 创建 File 对象: File file=new File(String path); 注意: File.seperater(); 获取系统分隔符, 如:\. 2.boolean file.exists(); 是否存在. 3.file.mkdir(); 或者 file.mkdirs(); 创建目录或多级目录 4.file.isDirectory() 或者 file.isFile()判断是否是目录或者是否是文件 5.file.delete(); 删除文件或目录 6.file.createNewFile(); 创建新文件 7.file.getName()获取文件名称或目录绝对路径 8.file.getAbsolutePath()获取绝对路径 9.file.getParent(); 获取父级绝对路径 10.file.getSize(); 获取文件大小 11.file.getFormat(); 获取文件格式名

ab7653affab982b574eb7acc55df2e04.gif

ab7653affab982b574eb7acc55df2e04.gifimportjava.io.File;

importjava.io.IOException;

publicclassFileDemo{

/**

* @param args

*/

publicstaticvoidmain(String[]args){

// 了解构造函数的情况 查帮助 ALT+/

Filefile=newFile("E:\\javaio\\imooc");

// 判断文件 / 文件夹是否存在

// System.out.println(file.exists());

if(!file.exists())

file.mkdir();// file.mkdirs()如果文件不存在, 直接创建文件夹

// mkdir 创建的一级目录, 如果需要创建多级目录可以使用 mkdirs()

else

file.delete();

// 是否是一个目录 如果是目录返回 true, 如果不是目录 or 目录不存在返回的是 false

System.out.println(file.isDirectory());

// 是否是一个文件

System.out.println(file.isFile());

// File file2 = new File("e:\\javaio\\ 日记 1.txt");

Filefile2=newFile("e:\\javaio","日记 1.txt");

if(!file2.exists())

try{

file2.createNewFile();

}catch(IOExceptione){

// TODO Auto-generated catch block

e.printStackTrace();

}

else

file2.delete();

// 常用的 File 对象的 API

System.out.println(file);// file.toString()的内容

System.out.println(file.getAbsolutePath());

System.out.println(file.getName());

System.out.println(file2.getName());

System.out.println(file.getParent());

System.out.println(file2.getParent());

System.out.println(file.getParentFile().getAbsolutePath());

}

}

FileDemo

遍历目录importjava.io.File;

importjava.io.IOException;

// 列出 File 的一些常用操作比如过滤, 遍历等操作

publicclassFileUtils{

/**

* 列出指定指定目录下 (包括其子目录) 的所有文件

*

* @param dir

* @throws IOException

*/

publicstaticvoidlistDirectory(Filedir)throwsIOException{

if(!dir.exists()){

thrownewIllegalArgumentException("目录:"+dir+"不存在");

}

if(!dir.isDirectory()){

thrownewIllegalArgumentException(dir+"不是目录");

}

// String[] fileNames =

// dir.list();// 返回的是字符串数组, list()方法用于列出当前目录下的子目录和文件, 直接子的名称, 不包含子目录下的内容

// for (String string : fileNames) {

// System.out.println(dir+"\\"+string);

// }

//

// 如果要遍历子目录下的内容就需要构造成 File 对象做递归操作, File 提供了直接返回 File 对象的 API

File[]files=dir.listFiles();// 返回的是直接子目录 (文件) 的抽象

if(files!=null&&files.length>0){// 确定存在子目录

for(Filefile:files){

if(file.isDirectory()){

// 递归

listDirectory(file);

}else{

System.out.println(file);

}

}

}

}

}

FileUtils

RandomAccessFile 的使用

RandomAccessFile JAVA 提供的对文件内容的访问, 既可以读文件, 也可以写文件 RandomAccessFile 支持随机访问文件, 可以访问文件的任意位置 (1)JAVA 文件模型 在硬盘上的文件是 byte byte byte 存储的, 是数据的集合 (2)打开文件 有两种模式 "rw"(读写) "r"(只读) RandomAccessFile raf = new RandomeAccessFile(file,"rw") 文件指针, 打开文件时指针在开头 pointer = 0; (3) 写方法 raf.write(int)--->只写一个字节 (后 8 位), 同时指针指向下一个位置, 准备再次写入 提供和很多方法能够一次读写一个基本类型的数据 (4) 读方法 int b = raf.read()--->读一个字节 (5)文件读写完成以后一定要关闭(Oracle 官方说明)

ab7653affab982b574eb7acc55df2e04.gif

ab7653affab982b574eb7acc55df2e04.gifimportjava.io.File;

importjava.io.IOException;

importjava.io.RandomAccessFile;

importjava.util.Arrays;

publicclassRafDemo{

/**

* @param args

*/

publicstaticvoidmain(String[]args)throwsIOException{

Filedemo=newFile("demo");

if(!demo.exists())demo.mkdir();

Filefile=newFile(demo,"raf.dat");

if(!file.exists())file.createNewFile();

RandomAccessFileraf=newRandomAccessFile(file,"rw");

// 指针的位置

System.out.println(raf.getFilePointer());

raf.write('A');// 只写了一个字节

System.out.println(raf.getFilePointer());

raf.write('B');

inti=0x7fffffff;

// 用 write 方法每次只能写一个字节, 如果要把 i 写进去就得写 4 次

raf.write(i>>>24);// 高 8 位

raf.write(i>>>16);

raf.write(i>>>8);

raf.write(i);

System.out.println(raf.getFilePointer());

// 可以直接写一个 int

raf.writeInt(i);

Strings="中";

byte[]gbk=s.getBytes("gbk");

raf.write(gbk);

System.out.println(raf.length());

// 读文件, 必须把指针移到头部

raf.seek(0);

// 一次性读取, 把文件中的内容都读到字节数组中

byte[]buf=newbyte[(int)raf.length()];

raf.read(buf);

System.out.println(Arrays.toString(buf));

for(byteb:buf){

System.out.println(Integer.toHexString(b&0xff)+" ");

}

raf.close();

}

}

RafDemo

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值