`
jythoner
  • 浏览: 607988 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

    博客分类:
  • Java
阅读更多
今天遇到了一个极其郁闷的问题,想写一段代码,可以给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) {
		}
	}
}


分享到:
评论
5 楼 jythoner 2009-02-09  
lyazure 写道

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


非常感谢,受教了,我把问题想简单了,呵呵
4 楼 lyazure 2009-02-06  
拷贝后还要写注册表,我们手动拷贝到font文件夹的时候会触发windows注册并拷贝这个字体。表面上看似乎我们做的是单纯的拷贝操作,其实并不是,同样我们把字体剪切过去时源目录的字体文件并不会消失,同样是触发windows注册和拷贝这个字体,效果都和双击这个字体文件一样。
   如果只是要在java程序里使用特定字体用java.awt.Font类就可以了,可以看看Font.creatFont()方法。注册到windows反而失去了跨平台的特性了。
3 楼 onelee 2009-02-06  
没错啊~~
试了下,可以用了额
2 楼 jythoner 2009-02-05  
引用
试试看java复制过去的文件能用Windows默认的查字器打开么?

能打开,但是里面不显示字体
可是文件大小和用工具比较都说是相同的
1 楼 njuptsoz 2009-02-05  
试试看java复制过去的文件能用Windows默认的查字器打开么?

相关推荐

    Java 新I/O

    Java 新I/O,也称为NIO(New Input/Output),是Java平台中对传统I/O模型的一种改进。在Java 1.4版本中引入的NIO库为开发人员提供了更高效、非阻塞的数据处理方式,特别适用于高并发、低延迟的系统。NIO的核心在于...

    Java I/O文件读写/删除/复制等

    复制文件通常使用 `FileInputStream` 和 `FileOutputStream` 结合 `BufferedInputStream` 和 `BufferedOutputStream` 来实现。通过读取源文件的字节并写入目标文件,可以完成复制操作。 4. **文件的权限设置** ...

    java i/0习题

    Java I/O(输入/输出)是Java编程语言中不可或缺的一部分,它允许程序与外部资源进行数据交换,如文件、网络连接、系统硬件等。在Java I/O中,我们使用流(Stream)的概念来处理数据,流是数据传输的通道。本套习题...

    java基础之I/O流

    使用I/O流进行文件复制是常见的应用场景,可以通过创建输入流和输出流,然后逐字节地复制,或者使用NIO的Channels和Buffers进行高效复制。 10. 数据流(Data Stream): DataInputStream和DataOutputStream支持...

    MaglevIO,一个易于使用和高效的Java I/O库。基于Java NATEVEIO。.zip

    MaglevIO是一个专注于提供易用性和高性能的Java I/O库,其设计灵感来源于Java的非阻塞I/O(Non-blocking I/O,NIO)框架。NIO是Java平台中一个重要的部分,它允许程序在处理大量并发连接时显著提高效率,尤其是在...

    Java中I/O流对文件进行复制粘贴及可能会出现的问题

    需求:将E:\电脑桌面壁纸\MisakaMikoto.jpg图片文件复制到D:\某科学的超电磁炮 目录下 public class Test { public static void main(String[] args) throws IOException { //创建字节输入流对象,关联数据源文件...

    I/O流复制文档或者歌曲等

    Java I/O字符流复制文档,字节流复制歌曲等 自己定义

    利用JDK7的NIO2.0进行I/O读写和监视

    这个更新极大地提升了Java处理I/O操作的能力,特别是在文件系统交互和网络通信方面。NIO2.0主要增加了对异步I/O的支持,允许程序在执行I/O操作时不必等待操作完成,而是可以继续执行其他任务,从而提高了程序的并发...

    Java I/O技术之文件操作详解

    Java I/O技术是Java编程中不可或缺的一部分,它用于处理输入和输出操作,特别是在与文件系统交互时。在Java中,I/O操作的核心是`java.io`包,它提供了丰富的类和接口来支持文件操作和其他形式的数据传输。本文将深入...

    Java I/O 操作及优化详细介绍

    Java I/O 操作是Java应用程序与外部数据交互的基础,涵盖了从磁盘文件读写到网络数据传输的各种场景。本文将深入探讨Java I/O的操作及优化技术。 首先,理解I/O的基本概念至关重要。在Java中,I/O是Input/Output的...

    java文件夹及文件复制

    在Java编程语言中,文件和文件夹的复制是一项常见的任务,尤其在系统迁移...以上就是关于Java中使用递归复制文件和文件夹的核心知识点。通过理解这些概念和实践,你将能够有效地在Java程序中处理文件和目录的复制任务。

    I/O程序的设计 设计语言java

    在IT行业中,I/O(Input/Output)程序设计是至关重要的,特别是在Java编程语言中。本文将深入探讨如何设计一个I/O程序,特别是在Java中实现文件的复制功能。我们将遵循标题和描述中的要求,详细解释如何打开文件...

    NIO与I/O的区别

    标题“NIO与I/O的区别”涉及到的是Java编程中关于输入/输出(I/O)模型与新I/O(New I/O,NIO)模型的对比。这两种模型在处理数据流时有不同的特性和适用场景,理解它们的区别对于优化Java程序的性能至关重要。 I/O...

    java dos界面实现的简单的文件复制、创建

    在Java编程语言中,我们可以利用...在实际开发中,推荐使用Java的I/O API,因为它提供了更好的控制、性能和跨平台兼容性。不过,理解如何通过DOS命令与系统交互仍然是有价值的,特别是在处理特定场景或兼容旧代码时。

    java文件复制

    在Java编程语言中,文件复制是一项基础且重要的操作,它涉及到I/O流的使用和文件处理。本项目实现了文本文件的复制功能,并提供了一个图形化用户界面(GUI),使得用户可以更加直观和方便地进行文件复制操作。接下来...

    Java实现文件复制,File文件读取,写入,IO流的读取写入

    本主题将深入探讨如何使用Java实现文件复制、File类的文件读取和写入,以及I/O流的读取与写入。下面将详细阐述这些知识点。 1. **Java文件复制** 文件复制通常涉及读取源文件内容并将其写入目标文件。在Java中,...

    javaIO学习课件 很详细的讲解

    Java I/O(输入/输出)是Java编程语言中不可或缺的一部分,它允许程序与外部资源进行数据交换,包括读取文件、网络通信、处理系统硬件等。这个“javaIO学习课件”提供了非常详尽的教程,旨在帮助初学者和有经验的...

    Java语言程序设计基础篇课后题答案-Chapter18BinaryI_O.pdf

    3. 文本I/O与二进制I/O的区别:二进制I/O直接将文件中的字节复制到内存,不进行转换;而文本I/O涉及编码和解码过程。Java虚拟机(JVM)在写入字符时将Unicode转换为特定文件编码,在读取时反之。 4. 字符表示:内存...

Global site tag (gtag.js) - Google Analytics