1
sunjiayao 2022-12-30 18:28:55 +08:00 1
自己做
|
2
yumenawei 2022-12-30 18:30:07 +08:00 1
哪个学校?这题挺有意思。
给个提示,百度搜下面两个工具类怎么使用。 FileInputStream FileOutputStream |
3
FurryR 2022-12-30 18:32:19 +08:00
可以试着读取 p1 p2 p3 用 FileInputStream ,splitlog.txt 用 BufferedReader 看看。
并不算一道很难的题目,不过我对 Java 了解不多,不能提供什么帮助。 |
4
sunjiayao 2022-12-30 18:41:21 +08:00
试了下并不难,参考 #2 的提示自己想想。 |
5
sunjiayao 2022-12-30 18:43:38 +08:00 1
|
6
zchzch1014 2022-12-30 18:52:49 +08:00
我试了一下用 ChatGPT 可以直接生成代码,自己稍改一下就可以用
|
7
passer9527 2022-12-30 18:56:43 +08:00 via iPhone
这个挺有意思,我想知道还原后的图片是啥
|
8
PTLin 2022-12-30 19:05:36 +08:00
不会 java ,闲的用 rust 写了一个。
```rust use std::{ error::Error, fs::File, io::{Read, Write}, }; fn main() { run().unwrap(); } fn run() -> Result<(), Box<dyn Error>> { let mut out = File::create("out.jpg")?; let mut files = [ File::open("files/p1")?, File::open("files/p2")?, File::open("files/p3")?, ]; let mut buffer = vec![0; 255]; let log = std::fs::read_to_string("files/splitlog.txt")?; for (l, r) in log.lines().map(|line| { let mut s = line.split('\t'); let l: usize = s.next().unwrap().parse().unwrap(); let r: usize = s.next().unwrap().parse().unwrap(); (l, r) }) { let file = &mut files[l]; let buffer = &mut buffer[..r]; file.read_exact(buffer)?; out.write_all(buffer)?; } Ok(()) } ``` |
9
ysc3839 2022-12-30 19:13:13 +08:00
顺手用 C 写了个
``` #include <stdio.h> int main() { FILE* f = fopen("splitlog.txt", "r"); FILE* p[3]; p[0] = fopen("p1", "rb"); p[1] = fopen("p2", "rb"); p[2] = fopen("p3", "rb"); FILE* o = fopen("out", "wb"); while (1) { int n = fgetc(f); if (n != '0' && n != '1' && n != '2') break; n -= '0'; int t = fgetc(f); if (t != '\t') break; unsigned char len = 0; for (size_t i = 0; i < 4; ++i) { int c = fgetc(f); if ('0' <= c && c <= '9') { c -= '0'; len *= 10; len += c; } else { char buf[255]; fread(buf, 1, len, p[n]); fwrite(buf, 1, len, o); break; } } } } ``` |
10
yangcao1122 2022-12-30 19:13:33 +08:00
下载不了
|
11
NanFengXiangWan OP @yangcao1122 #10 下载地址: https://cowtransfer.com/s/b98c8bccb74f45 口令:68wyp2
|
12
yangcao1122 2022-12-30 19:42:59 +08:00
确定合成的图片能打开吗?
|
13
KevinBlandy 2022-12-30 20:12:16 +08:00
|
14
passer9527 2022-12-30 20:52:46 +08:00
import java.io.*;
import java.nio.file.Files; import java.nio.file.Path; import java.util.HashMap; import java.util.List; import java.util.Map; public class Main { public static void main(String[] args) throws IOException { String path = "/Users/ssss/Downloads/Files (1)/"; List<String> lines = Files.readAllLines(Path.of(path + "splitlog.txt")); Map<Integer, InputStream> inputMap = new HashMap(){{ put(0, new FileInputStream(path + "p1")); put(1, new FileInputStream(path + "p2")); put(2, new FileInputStream(path + "p3")); }}; OutputStream out = new FileOutputStream(path + "out.jpg"); for (String line : lines) { String[] tmps = line.split("\t"); int fileN = Integer.parseInt(tmps[0]); int byteN = Integer.parseInt(tmps[1]); out.write(inputMap.get(fileN).readNBytes(byteN)); } out.close(); } } |
15
passer9527 2022-12-30 20:53:27 +08:00
@passer9527 我用的 java17
|
16
NanFengXiangWan OP @passer9527 #14 老兄请问您有本地测试过么
|
17
zhaogaz 2022-12-30 22:03:42 +08:00
这不就是操作流读么
为啥会搞不定, 你说问题,我们解决问题,不要直接要结果。。提升不了的。。。 |
18
NanFengXiangWan OP @KevinBlandy #13 老兄我是 Java8 的环境,运行时:
java: 无法将类 java.util.Random 中的方法 nextLong 应用到给定类型; 需要: 没有参数 找到: int,long 原因: 实际参数列表和形式参数列表长度不同 |
19
NanFengXiangWan OP @zhaogaz #17 这道题实在弄不明白,想参考下 V 友给的答案 o(╥﹏╥)o
|
20
passer9527 2022-12-30 22:20:18 +08:00
@NanFengXiangWan 本地成功了,java17
|
21
NanFengXiangWan OP @passer9527 #20 我现在用的 Java8 等我装个 Java17 试试,请问方便截个图么
|
22
passer9527 2022-12-30 22:39:57 +08:00
|
23
KevinBlandy 2022-12-31 09:26:16 +08:00
@NanFengXiangWan 我这是 JDK17 。
|
24
keshao 2022-12-31 10:01:59 +08:00
@KevinBlandy 老哥这个域名 666
|
25
msg7086 2022-12-31 13:52:44 +08:00
闲得用 Ruby 写了一个。
src = ['p1', 'p2', 'p3'] log = 'splitlog.txt' src_data = src.map {|fn| File.open(fn, 'rb')} output = '' File.readlines(log).each do |line| idx, len = line.rstrip.split(' ') output += src_data[idx.to_i].read(len.to_i) end src_data.map(&:close) File.binwrite('out.jpg', output) |
26
levelworm 2022-12-31 19:28:42 +08:00 via Android
|
27
huangzhe8263 2023-01-02 09:46:53 +08:00
这个不难啊,典型的面向 API 编程的题
点进来前我还以为是什么算法题 |
28
vdrapb 2023-01-06 11:06:01 +08:00
你如果是 java8 的,你把 passer9527 这位老哥的代码改造一下就可以了
// 题目要求 int singleMaxSize = 255; // DIR 就是存放 p1, p2, p3 的目录 Path logPath = DIR.resolve("splitlog.txt"); Path jpgPath = DIR.resolve("photo.jpg"); Map<String, InputStream> inputStreamMap = new HashMap<String, InputStream>(){ private static final long serialVersionUID = 1L; { put("0", Files.newInputStream(DIR.resolve("p1"))); put("1", Files.newInputStream(DIR.resolve("p2"))); put("2", Files.newInputStream(DIR.resolve("p3"))); }}; List<String> list = Files.readAllLines(logPath); try (OutputStream outputStream = Files.newOutputStream(jpgPath, StandardOpenOption.CREATE)){ list.forEach(line ->{ String[] split = line.split("\t"); String index = split[0]; int size = Integer.parseInt(split[1]); byte[] bytes = new byte[Math.min(size, singleMaxSize)]; try { if(inputStreamMap.get(index).read(bytes) > 0){ outputStream.write(bytes); } } catch (IOException e) { e.printStackTrace(); } }); } inputStreamMap.values().forEach(input ->{ try { input.close(); } catch (IOException e) { e.printStackTrace(); } }); |