A. java web项目启动报错,读取组件guava-14.0.1.jar失败,怎么解决啊
你需要把guava-14.0.1.jar导入你的项目里面。从网上下载这个jar包,如果你用eclipse IDE的话操作如下:右键单击工程,选择属性,然后从弹出的对话框左边的树形结构中选择java build path,中选择add extenal jars,然后再在路径中选择你要加的jar包。之后再运行应该就没问题了。
B. 怎么查看jar包里面的源码
在Eclipse查看开发包jar源码的方法如下:
1.选择项目,右键中单击【Properties】
2.【Java Build Path】-【Configure Build Path】-【Libraries】,在下面找到如:Guava-r09.jar包,展开它,选择【Source attachment】,单击右边的【Edit…】按钮。
3.在打开的窗口中,可选择文件(jar\zip),目录或工作空间中的jar文件,在这里我选择External Folder…,选择如E:/java project/guava即可。
4.连续单击【OK】两次回到Eclipse工作平台即可。
或者:
有源码,把它加到eclipse中:
方法1:直接用压缩软件打开相应的jar包,然后把源码拖进去压缩一下,最后选中工程刷新一下ok。
方法2:右击referenced libraries中需要导入源代码的包,右击properties->Java source attatchment,根据你源文件格式(源码可以是直接src文件夹,也可以是压缩成zip或jar后的压缩文件)在右边选择合适的方式,最后点击ok。
至于如何源码打进jar包,在eclipse中打jar包的时候有个“Export java source files and resources”选项,选中它打包就ok;也可以如方法1那样,用eclipse生成一般jar包之后,用压缩软件把src文件夹压进去。
C. java怎样读取文件所有内容,主要是跳行问题谢谢了
如果是字符流文件。可以使用
java.nio.file.Files类的readAllLines将所有内容读到一个List<String>里专
Google Guava库也提供了类属似的功能com.google.common.io.Files
static String
toString(File file,
Charset charset)
Reads all characters from a file into a String, using the given
character set.
D. 如何在eclipse中看jar包源代码
面是导入的方法:
我用的是eclipse,
在Eclipse查看开发包jar源码的方法如下:
1.选择项目,右专键中单击【属Properties】
2.【Java Build Path】-【Configure Build Path】-【Libraries】,在下面找到如:Guava-r09.jar包,展开它,选择【Source attachment】,单击右边的【Edit…】按钮。
3.在打开的窗口中,可选择文件(jar\zip),目录或工作空间中的jar文件,在这里我选择External Folder…,选择如E:/java project/guava即可。
4.连续单击【OK】两次回到Eclipse工作平台即可。
E. Java 循环读取文件导致内存溢出!
resultSet读取的时候是以流的方式读取的,每.next异常,读取一定的数据。所有是不会内存溢出的。
你的程序内存溢出代码
Vector<Vector<Object>> data = new Vector<Vector<Object>>();
while(reader.next()) {
Vector<Object> lineData = new Vector<Object>();
。。。。。。
}
你的data里面放着了1W条的数据,并且没一条都是一个linData,也就是说有1W个Vector对象,然后每一个line又有n个对象,内存的对象数量最少为1W*(n+1),在大的内存,这么玩也得挂。
解决方法:
1:直接用resultset,不把对象放到vector里面。
2:分页对取
F. java 如何读取大文件
以下将从常规方法谈起,通过对比来说明应该如何使用java读取大文件。
1、常规:在内存中读取
读取文件行的标准方式是在内存中读取,Guava 和Apache Commons IO都提供了如下所示快速读取文件行的方法:
Files.readLines(new File(path), Charsets.UTF_8);
FileUtils.readLines(new File(path));
这种方法带来的问题是文件的所有行都被存放在内存中,当文件足够大时很快就会导致程序抛出OutOfMemoryError 异常。
例如:读取一个大约1G的文件:
@Test
public void givenUsingGuava_whenIteratingAFile_thenWorks() throws IOException {
String path = ...
Files.readLines(new File(path), Charsets.UTF_8);
}
这种方式开始时只占用很少的内存:(大约消耗了0Mb内存)
然而,当文件全部读到内存中后,我们最后可以看到(大约消耗了2GB内存):
这意味这一过程大约耗费了2.1GB的内存——原因很简单:现在文件的所有行都被存储在内存中。
把文件所有的内容都放在内存中很快会耗尽可用内存——不论实际可用内存有多大,这点是显而易见的。
此外,我们通常不需要把文件的所有行一次性地放入内存中——相反,我们只需要遍历文件的每一行,然后做相应的处理,处理完之后把它扔掉。所以,这正是我们将要做的——通过行迭代,而不是把所有行都放在内存中。
2、文件流
FileInputStream inputStream = null;
Scanner sc = null;
try {
inputStream = new FileInputStream(path);
sc = new Scanner(inputStream, "UTF-8");
while (sc.hasNextLine()) {
String line = sc.nextLine();
// System.out.println(line);
}
// note that Scanner suppresses exceptions
if (sc.ioException() != null) {
throw sc.ioException();
}
} finally {
if (inputStream != null) {
inputStream.close();
}
if (sc != null) {
sc.close();
}
}
这种方案将会遍历文件中的所有行——允许对每一行进行处理,而不保持对它的引用。总之没有把它们存放在内存中:(大约消耗了150MB内存)
3、Apache Commons IO流
同样也可以使用Commons IO库实现,利用该库提供的自定义LineIterator:
LineIterator it = FileUtils.lineIterator(theFile, "UTF-8");
try {
while (it.hasNext()) {
String line = it.nextLine();
// do something with line
}
} finally {
LineIterator.closeQuietly(it);
}
由于整个文件不是全部存放在内存中,这也就导致相当保守的内存消耗:(大约消耗了150MB内存)