论坛首页 入门技术论坛

关于用Java I/O 复制文件的问题

浏览 3412 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-02-05  
今天遇到了一个极其郁闷的问题,想写一段代码,可以给windows自动安装一种字体。
原理就是将4个ttf字体文件复制到C:\\WINDOWS\\Fonts\\目录下。本来以为很简单,但用java I/O复制过去的字体不能使用(将记事本的字体改成DejaVuSansMono,如果有效果变化,就是正常的),直接手动复制同样的文件过去,就可以使用。不知道问题出在哪里?
哪位朋友帮忙看看,万分感谢,字体文件在附件中,代码如下:
package com.test;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;

public class FontInstall {

	public static void main(String[] args) {
		try {
			String[] fonts = { "DejaVuSansMono-Oblique.ttf",
					"DejaVuSansMono-BoldOblique.ttf", "DejaVuSansMono.ttf",
					"DejaVuSansMono-Bold.ttf" };
			System.out.println();
			for (int i = 0; i < fonts.length; i++) {
				// Create channel on the source
				FileChannel srcChannel = new FileInputStream(System
						.getProperty("user.dir")
						+ "\\" + fonts[i]).getChannel();

				// Create channel on the destination
				FileChannel dstChannel = new FileOutputStream(
						"C:\\WINDOWS\\Fonts\\" + fonts[i]).getChannel();

				// Copy file contents from source to destination
				dstChannel.transferFrom(srcChannel, 0, srcChannel.size());

				// Close the channels
				srcChannel.close();
				dstChannel.close();
			}
		} catch (IOException e) {
		}
	}
}

用另一种写法试了下,也是不行,复制过去的文件大小是相同的,用比较工具比较也没问题。
package com.test;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class FontInstall2 {

	public static void main(String[] args) {
		try {
			String[] fonts = { "DejaVuSansMono-Oblique.ttf",
					"DejaVuSansMono-BoldOblique.ttf", "DejaVuSansMono.ttf",
					"DejaVuSansMono-Bold.ttf" };
			System.out.println();
			for (int i = 0; i < fonts.length; i++) {
				InputStream in = new FileInputStream(System
						.getProperty("user.dir")
						+ "\\" + fonts[i]);
				OutputStream out = new FileOutputStream("C:\\WINDOWS\\Fonts\\"
						+ fonts[i]);

				// Transfer bytes from in to out
				byte[] buf = new byte[1024];
				int len;
				while ((len = in.read(buf)) > 0) {
					out.write(buf, 0, len);
				}
				in.close();
				out.close();
			}
		} catch (IOException e) {
		}
	}
}


   发表时间:2009-02-05  
试试看java复制过去的文件能用Windows默认的查字器打开么?
0 请登录后投票
   发表时间:2009-02-05  
引用
试试看java复制过去的文件能用Windows默认的查字器打开么?

能打开,但是里面不显示字体
可是文件大小和用工具比较都说是相同的
0 请登录后投票
   发表时间:2009-02-06  
没错啊~~
试了下,可以用了额
0 请登录后投票
   发表时间:2009-02-06  
拷贝后还要写注册表,我们手动拷贝到font文件夹的时候会触发windows注册并拷贝这个字体。表面上看似乎我们做的是单纯的拷贝操作,其实并不是,同样我们把字体剪切过去时源目录的字体文件并不会消失,同样是触发windows注册和拷贝这个字体,效果都和双击这个字体文件一样。
   如果只是要在java程序里使用特定字体用java.awt.Font类就可以了,可以看看Font.creatFont()方法。注册到windows反而失去了跨平台的特性了。
0 请登录后投票
   发表时间:2009-02-09  
lyazure 写道

拷贝后还要写注册表,我们手动拷贝到font文件夹的时候会触发windows注册并拷贝这个字体。表面上看似乎我们做的是单纯的拷贝操作,其实并不是,同样我们把字体剪切过去时源目录的字体文件并不会消失,同样是触发windows注册和拷贝这个字体,效果都和双击这个字体文件一样。&nbsp;&nbsp; 如果只是要在java程序里使用特定字体用java.awt.Font类就可以了,可以看看Font.creatFont()方法。注册到windows反而失去了跨平台的特性了。


非常感谢,受教了,我把问题想简单了,呵呵
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics