小编Zsw*_*Zsw的帖子

为什么我只能用ObjectInputStream一次读取1024个字节?

我编写了以下代码,将4000字节的0写入文件test.txt.然后,我一次以1000字节的块读取相同的文件.

FileOutputStream output = new FileOutputStream("test.txt");
ObjectOutputStream stream = new ObjectOutputStream(output);

byte[] bytes = new byte[4000];

stream.write(bytes);
stream.close();

FileInputStream input = new FileInputStream("test.txt");
ObjectInputStream s = new ObjectInputStream(input);


byte[] buffer = new byte[1000];
int read = s.read(buffer);

while (read > 0) {
    System.out.println("Read " + read);
    read = s.read(buffer);
}

s.close();
Run Code Online (Sandbox Code Playgroud)

我期望发生的是四次读取1000个字节.

Read 1000
Read 1000
Read 1000
Read 1000
Run Code Online (Sandbox Code Playgroud)

然而,实际发生的事情是,我似乎每1024字节"暂停"(因为缺少一个更好的词).

Read 1000
Read 24
Read 1000
Read 24
Read 1000
Read 24
Read 928
Run Code Online (Sandbox Code Playgroud)

如果我尝试读取超过1024个字节,那么我的上限为1024字节.如果我尝试读取少于1024个字节,我仍然需要暂停1024字节标记.

在输出文件的检查test.txt …

java objectoutputstream objectinputstream

24
推荐指数
2
解决办法
2288
查看次数

为什么在修改所选项目时,ListBox会触发SelectedIndexChanged事件?

我们获得了一个Windows窗体应用程序,它是从Microsoft Visual Studio的模板(PasteBin 1 2 3 4上的设计器代码)创建的,带有默认的ListBox exampleListBox和Button exampleButton.

我们使用1到10之间的数字填充ListBox.

for (int i = 0; i < 10; ++i)
{
    exampleListBox.Items.Add(i);
}
Run Code Online (Sandbox Code Playgroud)

然后我们添加两个事件处理程序.

exampleListBox_SelectedIndexChanged 将只是向控制台写入当前选定的索引.

private void exampleListBox_SelectedIndexChanged(object sender, EventArgs e)
{
    Console.WriteLine(exampleListBox.SelectedIndex);
}
Run Code Online (Sandbox Code Playgroud)

exampleButton_Click将当前所选索引的项目设置为自身.如此有效,这应该绝对没有改变.

private void exampleButton_Click(object sender, EventArgs e)
{
    exampleListBox.Items[exampleListBox.SelectedIndex] = exampleListBox.Items[exampleListBox.SelectedIndex];
}
Run Code Online (Sandbox Code Playgroud)

单击按钮时,我预计不会发生任何事情.然而,这种情况并非如此.exampleListBox_SelectedIndexChanged即使SelectedIndex没有更改,单击该按钮也会触发事件.

例如,如果我单击索引2中的项目exampleListBox,那么exampleListBox.SelectedIndex将变为2.如果我按exampleButton,则exampleListBox.SelectedIndex仍然是2.然而,exampleListBox_SelectedIndexChanged事件触发.

为什么即使所选索引未更改,事件也会触发?

此外,还有什么可以防止这种行为发生?

c# listbox selectedindexchanged winforms .net-4.5.2

9
推荐指数
1
解决办法
2480
查看次数

使用baseUrl导入模块时如何让tsc解析绝对路径?

考虑一个具有以下目录结构的简单打字稿项目:

|   package.json
|   tsconfig.json
|               
\---src
    |   app.ts
    |   
    \---foobar
            Foo.ts
            Bar.ts
Run Code Online (Sandbox Code Playgroud)

tsconfig.json已配置为具有./src/baseUrl.

{
    "compilerOptions": {
        "module": "commonjs",
        "target": "es6",
        "noImplicitAny": true,
        "removeComments": true,
        "preserveConstEnums": true,
        "outDir": "./dist/",
        "baseUrl": "./src/"
    },
    "include": [
        "./src/**/*"
    ],
    "exclude": [
        "node_modules"
    ]
}
Run Code Online (Sandbox Code Playgroud)

现在假设我们要导入FooBar.ts.我的理解是,通过设置baseUrl,我们现在可以使用绝对路径来导入模块

import { Foo } from 'foobar/Foo'
Run Code Online (Sandbox Code Playgroud)

而不是相对路径

import { Foo } from './Foo'
Run Code Online (Sandbox Code Playgroud)

如果我的理解是正确的,打字稿编译器应该能够自动解析foobar/Foo./Foo编译时Bar.ts.

import { Foo } from 'foobar/Foo';

export …
Run Code Online (Sandbox Code Playgroud)

typescript tsc tsconfig typescript2.0

9
推荐指数
3
解决办法
2539
查看次数

仅使用标准库创建“引用向量”的标准实践

我想创建一个对象,将该对象放入vector,并且仍然能够通过仅访问vector. 但是,我知道当一个对象指向push_back()a时vector,该对象实际上被复制到vector. 结果,访问 中的对象vector将仅访问类似但不同的对象。

我有 C 的初学者知识,所以我知道我可以创建一个指向对象的指针,并创建一个指针向量。例如vector<Object *>。然而,在 C++ 中似乎不鼓励使用指针首选引用。然而,我无法制作参考向量

我希望只使用标准库,所以boost对我来说是禁止的。

我听说过智能指针。然而,智能指针似乎有多种类型。为了这个目的会不会太过分了?如果智能指针确实是答案,那么我如何确定使用哪一个呢?

所以我的问题是:创建对象引用/指针向量的标准做法是什么?

换句话说,希望下面的(伪)代码能够工作。

#include <iostream>
#include <cstdlib>
#include <vector>

using namespace std;

class Object 
{
public:
    int field;
};

vector<Object> addToVector(Object &o)
{
    vector<Object> v;
    v.push_back(o);
    v[0].field = 3; // I want this to set o.field to 3.

    return v;
}

int main()
{ …
Run Code Online (Sandbox Code Playgroud)

c++ pointers reference vector standard-library

7
推荐指数
1
解决办法
3448
查看次数

使用PHP列出服务器上所有正在运行的进程

我正在尝试使用来获取当前在我的Ubuntu服务器上运行的所有进程的列表PHP。理想情况下,我想获得以下信息:

  • 进程ID
  • 用于执行过程的命令
  • 对过程的争论

我知道,我可以使用exec调用ps列出当前正在运行的进程。

exec('ps aux', $output);
Run Code Online (Sandbox Code Playgroud)

但是,输出使用任意数量的空格格式化,因此解析它并不是世界上最简单的事情。

我可能会使用explodepreg_split解析,但是有没有更简单的方法使用来获取所有正在运行的进程的列表php以及进程ID,命令和参数?

php linux ubuntu process ps

5
推荐指数
1
解决办法
9958
查看次数

在使用 TypeScript 时如何避免编写 Mongoose 的 Schema 两次?

我正在尝试将Mongoose与 TypeScript 一起使用。

仅使用 JavaScript,我们就可以非常轻松地编写模型的架构Foo

const fooSchema = new mongoose.Schema({
  name: String,
  value: Number
});

fooSchema.methods.someInstanceMethod = function() {/*...*/};

fooSchema.statics.someStaticMethod = function() {/*...*/};

const Foo = mongoose.model('Foo', fooSchema);
Run Code Online (Sandbox Code Playgroud)

我们可以Foo像这样使用:

Foo.someStaticMethod();
var foo = new Foo();
foo.someInstanceMethod();
foo.name;
Run Code Online (Sandbox Code Playgroud)

-

然而,现在我们有了 TypeScript,我们将收到错误消息:

类型“Model”上不存在属性“someStaticMethod”。

类型“文档”上不存在属性“someInstanceMethod”。

类型“文档”上不存在属性“名称”。

经过一番研究,我发现解决这个问题的方法是声明以下接口:

export interface IFooDocument extends mongoose.Document {
  name: string;
  value: number;
  someInstanceMethod(): any;
}

export interface IFooModel extends mongoose.Model<IFooDocument> {
  someStaticMethod(): any;
}
Run Code Online (Sandbox Code Playgroud)

并调整Foo为:

export const Foo = <IFooModel>mongoose.model<IFooDocument>('Foo', …
Run Code Online (Sandbox Code Playgroud)

javascript mongoose typescript mongoose-schema typescript2.0

5
推荐指数
1
解决办法
393
查看次数

仅当字段包含 ObjectId 时,猫鼬是否可以填充混合字段?

设置

假设我们有Foo和 的模式BarFoo有一个字段bar。该字段可以包含引用文档的 ObjectId,Bar也可以包含不是 ObjectId 的其他任意对象。

const fooSchema = new mongoose.Schema({
  bar: {
    type: mongoose.Schema.Types.Mixed,
    ref: 'Bar'
  }
});
const Foo = <any>mongoose.model<any>('Foo', fooSchema);

const barSchema = new mongoose.Schema({
  name: String
});
const Bar = <any>mongoose.model<any>('Bar', barSchema);
Run Code Online (Sandbox Code Playgroud)

问题

现在假设我们有一堆Foo文件。

我希望能够populate在该bar领域使用猫鼬自动将Bar文档的引用替换为实际Bar文档本身。我还想保留所有其他不引用Bar文档的对象不变。

通常,我会使用这样的方法来获取所有Foo文档,然后填充该bar字段:

Foo.find().populate('bar')
Run Code Online (Sandbox Code Playgroud)

但是,此方法在遇到bar字段中不是 ObjectId 的对象时会抛出异常,而不是让它们保持原样。

UnhandledPromiseRejectionWarning:未处理的承诺拒绝(拒绝 ID:1):CastError:对于模型“Bar”的路径“_id”处的值“Some任意对象”,CastError:转换为 ObjectId 失败

尝试寻找解决方案

我已经使用match …

javascript mongoose node.js typescript mongoose-populate

5
推荐指数
1
解决办法
1666
查看次数