Ruby Ruby 怎么将一个文件映射成文件输入流?

dw512 · 2015年12月02日 · 最后由 heliang7 回复于 2015年12月09日 · 3647 次阅读

java 里有 FileInputStream 可以调用,从而使得文件变成一个输入流 但是 ruby 怎么实现这个呢,找了好久都找不到,跪求大神们指点迷津,这里跪谢了。。。

你说的文件流,和直接打开文件有什么本质区别?

直接打开文件不就是 File.open 么,但是现在公司里面的一个参数是 file 后面是输入流,就是说把文件映射成文件流传入进参数里,而不是直接把文件传进。 我知道 java 里面有 Fileinputstream 这个方法,可以将指定文件映射成文件流,但是 ruby 貌似木有啊,你们知道怎么处理么

#2 楼 @dw512 Ruby 里的文件不是文件流么……? 还是不明白你想要什么

其实感觉没问清楚,最好能贴代码,以便说明你想要的效果,以及遇到的问题。

你说的是IO#pipe这个么

java 里的实现是这样的: FileInputStream 用于读取本地文件中的字节数据,继承自 InputStream 类 构造方法摘要 FileInputStream(File file) 通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的 File 对象 file 指定。 eg: FileInputStream fis=new FileInputStream("a.txt");

我想要在 ruby 代码里也实现这个功能,但是找不到类似 Fileinputstream 这样的方法,我到网上看到了一个 gem 叫做 rjb 可以桥接 ruby 和 java 的,但是不太会用。

我这样解释大家清楚了么

#3 楼 @msg7086

java 里的实现是这样的: FileInputStream 用于读取本地文件中的字节数据,继承自 InputStream 类 构造方法摘要 FileInputStream(File file) 通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的 File 对象 file 指定。 eg: FileInputStream fis=new FileInputStream("a.txt");

我想要在 ruby 代码里也实现这个功能,但是找不到类似 Fileinputstream 这样的方法,我到网上看到了一个 gem 叫做 rjb 可以桥接 ruby 和 java 的,但是不太会用。

我这样解释大家清楚了么

#4 楼 @qinfanpeng 大神你好

我们现在测试 api 接口时候,有个字段是 file,它的接收类型是 inputstream,也就是流类型,在 java 中有个 FileInputStream 的方法可以将文件映射成流作,但是在 ruby 里面好像没找到哎,下面是 java 里面的方法,大神你看一下

java 里的实现是这样的: FileInputStream 用于读取本地文件中的字节数据,继承自 InputStream 类 构造方法摘要 FileInputStream(File file) 通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的 File 对象 file 指定。 eg: FileInputStream fis=new FileInputStream("a.txt");

我想要在 ruby 代码里也实现这个功能,但是找不到类似 Fileinputstream 这样的方法,我到网上看到了一个 gem 叫做 rjb 可以桥接 ruby 和 java 的,但是不太会用。

我这样解释大家清楚了么

#5 楼 @mingyuan0715

IO 这个能把文件映射成流文件么。。。。

提问的智慧:描述目标而不是过程 http://doc.zengrong.net/smart-questions/cn.html#goal

#10 楼 @rei 我的目标就是使用 ruby 语言实现将一个文件映射成一个流。。。。

#11 楼 @dw512 什么是流?

File 类继承自 IO 类,官方文档定义 IO 类为:

The IO class is the basis for all input and output in Ruby. An I/O stream may be duplexed (that is, bidirectional), and so may use more than one native operating system stream.

ruby 里面文件本身就是流 (IO),可以逐字符、逐行、逐字节读取

尝试用 IO 这个类,应该可以实现

#14 楼 @qhwa RUBY 里面怎么上传本地文件呢, 是 File.new("filepath","mode")?么

#15 楼 @pathbox 求加 qq 号,方便指导和联系啊 #14 楼 @qhwa 求加 qq 号,方便指导和联系啊

很严肃地告诉你,你还是没说清楚你要的是什么。 你说要流,但是却不说流是什么。


如果你要和 Java 的 API 对接,那么首先 MRI Ruby 就不合适了,因为底层是 C 接口实现。 如果你用 JRuby 的话,我不熟,但是我觉得应该也不能直接在二进制层面上交流。

JRUBY 的话直接使用 java 的类就好了。 RUBY 的话,根本就不用考虑“流”。@rei说的好,目的是读文件的话,代码怎么能生搬硬套呢?

#19 楼 @heliang7 好吧,可能我还没说太清楚吧。 是这样的,我们现在公司有个发起合同的接口,这个接口中的最后一个参数是 file,接收的类型是流类型,而不是直接把文件路径和文件名加上就可以的,java 中的处理是先 new,之后使用 Fileinputstream 把指定路径上的文件映射成流传入到 file 的参数里面。 但是 ruby 应该怎么处理呢 这个不是读文件,而是上传文件,但是上传文件的类型是把文件映射成流后上传

#18 楼 @msg7086 发起合同的最后一个参数是 file,也就是要把合同文件上传上去 但是该字段 file 的接收类型是文件流类型,其实不是读取文件吧,是上传文件的功能,只是上传的文件是映射成流传入到 file 参数里面。

#21 楼 @dw512 我明白了,这个接口是 web 的吧?其实 file 传进来就是文件的 2 进制数据。看看 ruby 中文件和 2 进制的关系相关的 API 就应该有办法了。

#22 楼 @heliang7 求大神指点啊,找不到相关的呢,大神,求加 qq1029569337,不清楚的还能咨询你哈

《提问的智慧》 学习一下怎么提问吧。 说了 20 多层楼还没把提问问题的上下文搞清楚,这感觉没法回答了。

是不是 就是从 URI 获取文件 并上传呢

#25 楼 @hammer 是从本地上传文件的, 我是这么写的: file=File.new('/home/dingwei/ssqian/ssqian-api-test/spec/support/source/itFAQ.pdf','rb') 但是 file 可接受的参数是个文件流的类型

#23 楼 @dw512 你后面的说明,让我感觉你要用 ruby 调用 java 接口,请问你是在用 jruby 么?感觉你的表达不是很清楚呢。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号