| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1568 人关注过本帖
标题:[求助]写文件出现乱码..
只看楼主 加入收藏
mmstarzyc
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2006-4-10
收藏
 问题点数:0 回复次数:5 
[求助]写文件出现乱码..

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.io.IOException;
import java.nio.IntBuffer;


public class TryPrimes{
public static void main(String[] args){
int[] primes=new int[100];
int a=0;
boolean isPrimes=true;
Outerloop:
for(int i=3;i<=100;i++){
for(int j=2;j<i;j++){
if(i%j==0){
isPrimes=false;
continue Outerloop;
}

}
primes[a]=i;
System.out.println(primes[a]);
a++;
}

String dirName="f:/stuff";
String fileName="primes.txt";
File dir=new File(dirName);

if(!dir.exists()){
if(!dir.mkdir()){
System.out.println("Can not created directory!");
}
}

File aFile=new File(dirName,fileName);
FileOutputStream outputFile=null;
try{
outputFile=new FileOutputStream(aFile,true);
System.out.println("OutputStream created!");
}catch(FileNotFoundException e){
e.printStackTrace(System.err);
}

FileChannel outChannel=outputFile.getChannel();
ByteBuffer buf=ByteBuffer.allocate(1024);
IntBuffer intBuffer=buf.asIntBuffer();


for(int prime:primes){
intBuffer.put(prime);
}

try{
outChannel.write(buf);
outputFile.close();
System.out.println("contents have been writed!");
}catch(IOException e){
e.printStackTrace(System.err);
}
System.exit(0);



}
}
为什么写进文件的不是素数而是乱码...帮忙看下啊..

搜索更多相关主题的帖子: 乱码 文件 
2006-04-10 13:08
伯约
Rank: 1
等 级:新手上路
帖 子:57
专家分:0
注 册:2006-4-5
收藏
得分:0 

你这程序有错误,改为这样:
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.io.IOException;
import java.nio.IntBuffer;


public class TryPrimes{
public static void main(String[] args){
int[] primes=new int[100];
int a=0;
boolean isPrimes=true;
Outerloop:
for(int i=3;i<=100;i++){
for(int j=2;j<i;j++){
if(i%j==0){
isPrimes=false;
continue Outerloop;
}

}
primes[a]=i;
System.out.println(primes[a]);
a++;
}

String dirName="f:/stuff";
String fileName="primes.txt";
File dir=new File(dirName);

if(!dir.exists()){
if(!dir.mkdir()){
System.out.println("Can not created directory!");
}
}

File aFile=new File(dirName,fileName);
FileOutputStream outputFile=null;
try{
outputFile=new FileOutputStream(aFile,true);
System.out.println("OutputStream created!");
}catch(FileNotFoundException e){
e.printStackTrace(System.err);
}

FileChannel outChannel=outputFile.getChannel();
ByteBuffer buf=ByteBuffer.allocate(1024);
IntBuffer intBuffer=buf.asIntBuffer();

for(int prime=0;prime<primes.length;prime++){ //就是这个for语句的问题,我改了就能正常运行.
intBuffer.put(prime);
}

try{
outChannel.write(buf);
outputFile.close();
System.out.println("contents have been writed!");
}catch(IOException e){
e.printStackTrace(System.err);
}
System.exit(0);
}
}


2006-04-10 13:16
mmstarzyc
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2006-4-10
收藏
得分:0 

运行都是正常的 就是写入文件的内容不是素数而是乱码...改成你这样也是乱码啊..

2006-04-10 14:43
伯约
Rank: 1
等 级:新手上路
帖 子:57
专家分:0
注 册:2006-4-5
收藏
得分:0 
哦,那我也不知道怎么回事!
是不是你的FileChannel函数有问题?我不是 很懂这函数:你看看下面的:
这是FileChannel的write函数:
write
public abstract int write(ByteBuffer src,
                          long position)
                   throws IOException
从给定的文件位置开始,将字节序列从给定缓冲区写入此通道。

除了从给定的文件位置开始写入各字节,而不是从该通道的当前位置外,此方法的执行方式与 write(ByteBuffer) 方法相同。此方法不修改此通道的位置。如果给定的位置大于该文件的当前大小,则该文件将扩大以容纳新的字节;在以前文件末尾和新写入字节之间的字节值是未指定的。

参数:
src - 要传输其中字节的缓冲区
position - 开始传输的文件位置;必须为非负数
返回:
写入的字节数,可能为零
抛出:
IllegalArgumentException - 如果 position 为负
NonWritableChannelException - 如果不允许对此通道进行写入操作
ClosedChannelException - 如果此通道已关闭
AsynchronousCloseException - 如果正在进行写入操作时另一个线程关闭了此通道
ClosedByInterruptException - 如果正在进行写入操作时另一个线程中断了当前线程,因此关闭了该通道并将当前线程的状态设置为中断
IOException - 如果发生其他 I/O 错误
我觉得 你换一个类的write函数试试!
不好意思呀,我也不会!

2006-04-10 21:58
★王者至尊★
Rank: 1
等 级:新手上路
帖 子:528
专家分:0
注 册:2006-3-28
收藏
得分:0 
问题出在这里:
----------------------------------------------
try{
outChannel.write(buf);
outputFile.close();
System.out.println("contents have been writed!");
}catch(IOException e){
e.printStackTrace(System.err);
}
----------------------------------------------
写入的时候,不能write()的参数应该用write(ByteBuffer[] srcs)
即前面要定义buf[]
不知道我说的对不?
还又一点,你用write()方法其参数是ByteBuffer类型的,但是你把素数放入的是IntBuffer类型的对象里,它怎么可能正确显示?

[此贴子已经被作者于2006-4-10 23:11:34编辑过]


------Java 爱好者,论坛小混混,学习中------
2006-04-10 22:59
晓狐狸
Rank: 2
等 级:新手上路
威 望:3
帖 子:95
专家分:0
注 册:2006-4-6
收藏
得分:0 
中文汉字 占用2个字节 英文字母占一个字节

我们写入文件的时候 不要写入字节,我们直接写入一个字符串wirteChars()

读的时候 我们也不要读字节 直接读取一个字符(一个字符不论是汉字或英文字母 都占用2字节)使用readChar()这样统一之后 就没有这个问题的。

2006-04-11 13:13
快速回复:[求助]写文件出现乱码..
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018029 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved