在Java中读取InputStream时遇到IOException

在Java中读取InputStream时遇到IOException,java,io,ioexception,Java,Io,Ioexception,我正在Java程序中运行这些代码行 FileInputStream in = new FileInputStream(file); InputStreamReader reader = new InputStreamReader(in); int fileLength = (int)file.length(); pstmt1.setCharacterStream(6, reader, fileLength); 但是我在一些文件中

我正在Java程序中运行这些代码行

        FileInputStream in = new FileInputStream(file);
        InputStreamReader reader = new InputStreamReader(in);
        int fileLength = (int)file.length();

        pstmt1.setCharacterStream(6, reader, fileLength);
但是我在一些文件中得到了以下异常,但不是在所有文件中

异常:在读取InputStream参数#6时遇到IOException。 剩余数据已用0x0填充。有关详细信息,请参见随附的一次性广告。ERRORCODE=-4225,SQLSTATE=null

当我使用DB2数据库时,表的结构是-

CREATE TABLE SOURCE (
                LIB VARCHAR(10) NOT NULL,
                FILE VARCHAR(10) NOT NULL,
                MBR VARCHAR(10) NOT NULL,
                ATTR VARCHAR(10) NOT NULL,
                SEQ DOUBLE NOT NULL,
                DTA CLOB(5M),
                DAT INTEGER,
                RECN INTEGER,
                UNIQUE (LIB, FILE, MBR, ATTR, SEQ) 
            );
请帮助我恢复此异常


提前谢谢

我怀疑问题在于您是根据文件的长度(以字节为单位)设置长度,而
setCharacterStream
的参数是以字符为单位的长度

您还使用了平台默认编码,这很少是一个好主意

你知道数据是用什么编码的吗?如果是固定宽度编码,则可以根据字节数计算出字符数。否则,最好调用不指定长度的重载:

pstmt1.setCharacterStream(6, reader);

(但在创建
InputStreamReader
时,请务必更改代码以指定编码)

我怀疑问题在于您是根据文件长度(以字节为单位)设置长度,而
setCharacterStream
的参数是以字符为单位的长度

您还使用了平台默认编码,这很少是一个好主意

你知道数据是用什么编码的吗?如果是固定宽度编码,则可以根据字节数计算出字符数。否则,最好调用不指定长度的重载:

pstmt1.setCharacterStream(6, reader);

(但在创建
InputStreamReader
时,一定要更改代码以指定编码)

添加到上述Jon的答案中。尝试在此处使用Reader对象

Reader reader = (Reader) new BufferedReader(new FileReader(file));
int fileLength = (int)file.length();
pstmt1.setCharacterStream(6, reader, fileLength);

补充乔恩上述的回答。尝试在此处使用Reader对象

Reader reader = (Reader) new BufferedReader(new FileReader(file));
int fileLength = (int)file.length();
pstmt1.setCharacterStream(6, reader, fileLength);

@可能是AnkurShanbhag。是的,它是一个PreparedStatement
查看附件Throwable了解详细信息
-我们可以看看吗?@AnkurShanbhag可能是。是的,它是一个PreparedStatement
查看附件Throwable了解详细信息
-我们可以看看吗?您建议的方法在Java 5中不可用。你是在说JDK 6还是higher@Kishore:是的,它是在Java 6中引入的。如果您仍在使用Java的一个古老版本,我建议您尝试升级,它将使您的生活在各个方面变得更简单。@JonSkeet先生,您能告诉我上述问题的正确解决方案吗。实际上,我只限于JDK1.5。那么在JDK1.5中有没有固溶体呢。谢谢@Siddharth:你可以先从读卡器读入内存——要么扔掉数据,只计算字符,要么将其存储在
StringWriter
中,然后再转换成
String
。无论哪种方式,这都会让你计算出正确的字符数。@Siddharth:“仍然不工作”并没有提供足够的信息,目前你正在丢失行尾。我不建议一次读一行-我建议一次读一个块(使用
read(char[])
),并将读取的字符数写入
StringWriter
。最后,您可以将整个内容转换为一个字符串,可能只需调用
setString
。你是在说JDK 6还是higher@Kishore:是的,它是在Java 6中引入的。如果您仍在使用Java的一个古老版本,我建议您尝试升级,它将使您的生活在各个方面变得更简单。@JonSkeet先生,您能告诉我上述问题的正确解决方案吗。实际上,我只限于JDK1.5。那么在JDK1.5中有没有固溶体呢。谢谢@Siddharth:你可以先从读卡器读入内存——要么扔掉数据,只计算字符,要么将其存储在
StringWriter
中,然后再转换成
String
。无论哪种方式,这都会让你计算出正确的字符数。@Siddharth:“仍然不工作”并没有提供足够的信息,目前你正在丢失行尾。我不建议一次读一行-我建议一次读一个块(使用
read(char[])
),并将读取的字符数写入
StringWriter
。最后,您可以将整个内容转换为一个字符串—可能只需调用
setString
。这会有什么帮助?您正在围绕
FileReader
创建
BufferedReader
,而不是围绕
FileInputStream
创建
InputStreamReader
。这意味着OP甚至不能指定编码,他们应该。。。并且不能解决以字节而不是字符指定长度的问题。@raVan如果我实现了您的建议,那么现在异常被更改了。在读取InputStream参数#6时,exoption提前到达了流的末尾。剩余数据已用0x0填充。ERRORCODE=-4225,SQLSTATE=null这有什么帮助?您正在围绕
FileReader
创建
BufferedReader
,而不是围绕
FileInputStream
创建
InputStreamReader
。这意味着OP甚至不能指定编码,他们应该。。。并且不能解决以字节而不是字符指定长度的问题。@raVan如果我实现了您的建议,那么现在异常被更改了。在读取InputStream参数#6时,exoption提前到达了流的末尾。剩余数据已用0x0填充。ERRORCODE=-4225,SQLSTATE=null