为什么实用java randommAccessFile老是提示没有权限

java错误及其处理(48)
请看下面这段代码,相关的问题我应经注释了出来:
import java.io.EOFE
import java.io.F
import java.io.FileNotFoundE
import java.io.IOE
import java.io.RandomAccessF
import java.util.ArrayL
public class StoreAndLoad {
final String fileNameString=&E:\\javaSE代码\\TimeManager\\data\\data.txt&;
final int CHAR_LENGTH=2;
File file=new File(fileNameString);
public RandomAccessFile fileStoreD
final char dataSeparator='\32';
public void writeOneDayIntoFile(String[] parameterStrings){
if (!file.exists()) {
file.createNewFile();
} catch (IOException e) {
System.out.println(&File failed to establish&);
fileStoreData=new RandomAccessFile(file, &rw&);
fileStoreData.seek(fileStoreData.length());
for (int i = 0; i & parameterStrings. i++) {
fileStoreData.writeUTF(parameterStrings[i]);
fileStoreData.writeChar(dataSeparator);
} catch (FileNotFoundException
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
public ArrayList&String& readOneDayFromFile(){
ArrayList&String& arrayList=new ArrayList&String&();
while (true) {
//System.out.println(fileStoreData.getFilePointer());
//上面那行语句返回的结果是0,说明下面的语句在读的时候,不是从文件末尾读的。
arrayList.add(fileStoreData.readUTF());
fileStoreData.skipBytes(CHAR_LENGTH);
}catch (EOFException e) {
if (arrayList.size()==0) {
System.out.println(&arraylist is empty&);
//上面的if语句会得到调用,说明确实是从文件头读到了文件尾
//怪异的是,arrayList怎么会没有数据呢?
return arrayL
} catch (IOException e) {
e.printStackTrace();
可以看到,上述代码中,我用的是txt格式的文档来记录数据。但是以前写这段代码的时候,因为单元测试不通过,文件中有乱码,我就想是不是编码格式的问题。所以就将这个文件另存为UTF-8这种格式的文件。覆盖了以前的那个。注意,现在如果不删除这个文件的话,这个文件内的所有内容都是UTF-8编码方式来编码的,但是在解析时用的是别的编码方式,似乎是GB2312。所以这样就会造成上述代码中读不出来数据的现象。但是当我将readUTF换成readDouble,相应的别的内容也换一下的话,它还是能读出数据的。这就比较怪异了。将这份文档删掉,再用代码重新创建一个,就能解决读不出来数据的问题了。
访问:637392次
积分:8119
排名:第2986名
原创:208篇
转载:152篇
评论:44条
(2)(2)(1)(2)(3)(1)(13)(10)(34)(30)(10)(14)(17)(45)(7)(12)(45)(49)(20)(26)(17)(1)2223人阅读
个人学习总结:
关于File类
File file = new File(…);
这里的file 表示的是一个文件或者一个目录,创建时里面是一个抽象的路径,尽量使用相对路径来创建这样一个file对象。
因为操作系统不同”/”(其它)和”\”(windows)也不同,所以可以使用File类里的一个常量: File.separator
&&&&&& 关于这个file对象的几个重要的api
&&&&&& 1. exists& 判断该目录或者文件是否存在;
&&&&&& 2. isFile和isDirectory判断该file对象是一个文件还是一个目录;
&&&&&& & 注意:如果该file对象不存在 那这两个方法都是false。有点废话,不存在当然是false了
&&&&&& 3.createNewFile:创建新文件
注意:该方法必须保证,这个文件之前的目录是存在的,如果文件的之前的目录不存在,那是创建不了的。另外该file文件是不存在的,如果已经存在了也创建不了,没有覆盖一说。所以想要使用这个方法,必须注意两点:a.文件之前的目录存在;b.该文件不存在。
mkDir:创建目录 该方法必须保证父目录存在,如果父目录不存在或者该目录已经存在则不创建,没有覆盖一说。
mkDirs: 创建目录以及不存在的父目录 该方法是对前一个方法的升级 如果父目录不存在该方法也能创建出父目录,如果父目录存在则在相应的目录下创建出不存在的子目录,没有覆盖一说。
以上三个方法 如果创建成功 则都会返回一个true 否则返回false,但是mkDirs如果创建失败,也有可能创建了一些必要的目录,这里要注意一下。
&&&&&& 4.length:long& 返回该file对象所占用的空间 (字节数)
&&&&&& 5.delete:该方法用来删除该file对象,删除成功返回ture 否则false
&&&&&& 注意:删除的如果是一个目录,则该目录必须是一个空目录,里面不可以有子项,所以要想删除&&&&&& 有子项的目录,记得上课的时候老师说 要用递归的办法,具体百度。
6.listFiles:File[]该方法返回该file对象的所有子项(子目录和文件)的抽象路径数组,所以这个file合理的就是一个目录了,如果不是一个目录或者这个目录是空的或者发生了IO错误,则返回null。经典使用方法,获得该目下所有子项路径File[] subs = file.listFile(“.”);
和这个方法配套的一个接口就是FileFilter接口:抽象路径过滤器,使用方法一般是用匿名内部类:
File subs =file.listFile(new FileFilter(){
&&&&&& @Override
&&&&&& public boolean accept(File pathname){
&&&&&& return pathname.getName().一些方法()
一些方法有:startsWith(“.”)&以.开头
&&&&&&&&&&&&&&&&&&&& &endsWith(“.txt”) 以.txt结尾 等
以上就是File这个类的用处,主要记得区分文件和目录,两个都使用该类创建对象,但是两者的api略有不同,所以要分清是目录还是文件,但是这个File类只是用于文件目录的管理,对文件的读写需要别的类来操作。
关于RandomAccessFile
RandomAccessFile raf = new RandomAccessFile(Filefile,String mode);
RandomAccessFile raf = new RandomAccessFile(Stringfilename,String mode);
这里的文件可以是一个file对象 也可以是一个file的抽象路径。
另外如果该file不存在,则通过该对象的建立会自动生成一个file,相当于createNewFile了下。所以了,如果是不存在的文件,创建的file的前的目录必须存在,否则报找不到文件的错误。不再赘述,详情看file的createNewFile。
这个类是基于指针的方式对文件进行读写的 模式mode一般用”rw”读写、”r”读。
1.关于该类的单个字节的读写方法:
如果写入的是一个int型则 将该int的值的低8位写入(刚好一个字节) 所以建议int最大值就是255,否则数字就不准确了 因为一个int是四个字节即32个位 00 ,如果超过255的话就跳到第9位,比如256是01
实际写入的其实是0,而257则是01
实际写入的是1
另外之前说了 该对象是基于指针的形式,不管你是write()一次 还是read() 一次指针都往后移动一次 从第0个开始,如果read()到末尾 则会返回一个-1(当然这里读写都不是字节数组)。
2.所以 读写还可以是字节数组的形式。
关于字节数组的读写,首先你要创建一个字节数组
byte[] buf = “HelloWorld”.getBytes() 通过该方法可以将一个字符串转成一个字节数组
然后通过raf.write(buf); 即可将整个字节数组写入到文件 当然此时的指针指向第10个位置(从0开始)。
字节数组形式读文件,这里理解方式要注意:
关于字节数组形式的读文件 使用read(byte[] buf) 方法后返回的并非一个byte[],而是一个int,这个int是此次读文件操作 读到的字节个数。
这个点理解起来是比较搞的:但是我们只能接受,知道如何使用读方法,按步骤来:
既然要读数组 首先需要一个数组容器 所以我们先创建一个byte[] buf = new byte[?]; 关键在于这个容器的长度到底设置多少? 我自己是这样想的设置成 (int)file.length() 这样文件多大就读多少,当然肯定有个限制了,这里姑且就这样了。
但是为了说明问题,其实这里的buf容器 决定了你读一次所获得的长度以及指针指向的位置。
如果byte的长度少于文件的长度 那么指针就会指向第0+byte.length个位置,如果此次读取的byte长度超过了文件的末尾,则指针只会停留在最后一个位置(EOF)即 第0+file.length()处。
重点是读到的内容放在哪里了呢?内容放在了你定义的那个byte[]容器里了。文件里的数据以单个byte存放在在byte[] buf容器里。
3.seek和skipBytes方法 这两个方法是控制raf指针的 seek(n) n从0~file.length 通过该方法可以将raf的指针指向任何位置。
skipBytes(n) 顾名思义就是跳过多少个字节 通过该方法可以将指针往后跳。但是最远只能到file.length()
4.getFilePointer:获得此时的指针位置
5.raf.close()方法 总之这个是关闭raf和文件的关联 释放资源,如果创建了raf对象 记得在最后使用该方法。
通过以上对RandomAccessFile的介绍可以知道,这个类就是关联上一个文件,可以对文件进行基于指针的读写操作。当然,关于读写它还有很多别的api,比如readline()方法 返回该行的String
但是需要进行一次编码转换:
String s = raf.readLine();
String ns = new String(s.getBytes(8859-1),”GBK”); 因为raf.readLine()读取过来是按照ISO8859-1编码读取,后面的GBK则是文本文件的编码格式,所以GBK是可以改变的,根据你的文件的编码格式。
如此在控制台显示的字符串才能正确看见。
读完最后一行后 再读将返回null,所以可以通过是否为null来判断是否读完(使用while循环)。
访问:6086次
排名:千里之外
原创:11篇
(1)(1)(4)(1)(2)(2)RandomAccessFile的问题_百度知道
RandomAccessFile的问题
//为什么会抛出异常
import java.io.DataInputS
import java.io.DataOutputS
import java.io.FileInputS
import java.io.FileOutputS
import java.io.IOE
import java.io.RandomAccessF
class lyra
我有更好的答案
RandomAccessFpublic class RandomAccessFileTest { public RandomAccessFileTest() {
RandomAccessFile dos = new RandomAccessFile(&quot,读之前须调用seek尽量不要在构造函数里做额外的工作import java.readInt());
} catch (IOException e) {
e.printStackTrace();
} } public static void main(String xx[]) {
new RandomAccessFileTest();, &quot.io.IOEimport java.rw&
dos.writeInt(1);
dos.seek(0).println(tmp1&quot.
S)改成这样就好了,原因是文件指针已经在结尾
采纳率:31%
为您推荐:
其他类似问题
randomaccessfile的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。用randomaccessfile动态追踪文件的坑 - 简书
用randomaccessfile动态追踪文件的坑
做日志分析,需要动态追踪日志文件,结果发现用randomaccessfile一直无法动态追踪到后续的文件内容,一直担心自己的代码出现了问题,发现逻辑没有问题,然后又怀疑是不是randomaccessfile本身的坑,仔细查询了randomaccessfile的api文档和读了底层代码,发现也没有什么特殊的地方,又怀疑是否是read方法的问题 换成read(byte[] buf)还是一样,然后仔细想了一下,怀疑是我们使用rsync -azSH 参数导致的 因为我们没有使用 -u这个选项 可能会造成文件会删除再创建,虽然不知道是否会这样 但是我用了lsof 去看了一下
发现了一个很有意思的事情,java
25789 jiagou
6685945 /xx/xx/xxx/Online/xxx.xxx.xx.xx/log/xxxx/xxxx/xxxx.log (deleted)难怪我无法追踪到最新的文件了 回头加上u参数再试试
宜信架构师
Ubuntu的发音 Ubuntu,源于非洲祖鲁人和科萨人的语言,发作 oo-boon-too 的音。了解发音是有意义的,您不是第一个为此困惑的人,当然,也不会是最后一个:) 大多数的美国人读 ubuntu 时,将 u 作为元音发音,类似单词 who 或者 boo ,重音在第...
[TOC] Class I. Words Expressing Abstract Relations Section I. Existence 1. Being, in The Abstract existence 1 absolute
a.绝对的,完全的; 无(条件...
Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智能路由,微代理,控制总线)。分布式系统的协调导致了样板模式, 使用Spring Cloud开发人员可以快速地支持实现这些模式的服务和应用程序。他们将在任何分布式...
sqlmap用户手册 说明:本文为转载,对原文中一些明显的拼写错误进行修正,并标注对自己有用的信息。 =================================================================== 当给sqlmap这么一个url (h...
用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你能获得这些料: 知道setContentView()之后发生了什么? ... Android 获取 View 宽高的常用正确方式,避免为零 - 掘金 相信有很多...
来源|中国医疗器械采购公共服务平台整理 日,陕西省卫生计生委、陕西省医改办在延安召开全省进一步推广深化医改经验现场会,会议总结推广了延安医疗集团等典型经验,并对当前和今后一个时期的医改重点任务进行了安排部署。会议指出,从日起,全省各级医疗...
但凡死缠烂打的人,大都不是真的深爱你,那只是在跟自己赛跑。真正爱你的人,做不到死缠烂打。因为自尊不允许。我们一直深信,爱就是把最好的一切给予对方,包括尊严。多少浅浅淡淡的转身,是旁人看不懂的情深。 ——出自网易云音乐赵雷《少年锦时》热评
致羞涩的情人 安德鲁·马韦尔译:chenshuo 倘若拥有悠长的时空可以消磨爱人,你的羞涩,便实不为过让我们细细思量,在哪条路上漫步,陪你度过充满爱的时光当你,信步在印度的恒河之畔寻觅着宝石,我却对着亨伯湾汹涌而来的潮汐,吟唱,只愿洪荒来临时,我已爱了你十年如果你可以,请一...
1.熟练运用react-native技术 2.能够熟练阅读英文文档,并熟练在overflow社区发帖提问与回答 3.完整阅读一遍react 或 vue 源码 以上为2017年机会, 望督促自己完成
Error Domain=NSCocoaErrorDomain Code=3840 &No string key for value in object around character 9 一般情况下是json的格式错误,注意json的key和value都是双引号{/&k...他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)

我要回帖

更多关于 c random 的文章

 

随机推荐